После долгих испытаний и изменений в моем приложении QT Visual Leak Detector определил источник досадной утечки (8 байтов). VLD сообщил, что приложение QT является чистым, за исключением указателя QThread*
.QThread создает утечку памяти
Немного реализации фона: приложение моделируется как гибрид решения Джеффри Холмса, Bulk download of web pages using Qt. Благодаря Джеффри для более раннего решения!
Вопросы:
Почему
QThread*
не уничтожает себя, когда рабочий поток завершит свою работу?Как я могу заставить
QThread*
удалить поток и рабочий объект, когда работа завершена?Должно ли
QThread
быть реализовано по-разному?
Код:
void vqMDIChildDialog::processWorkQueue(bool bIsBC)
{
if (m_listOfTables.isEmpty() && currentReplicationThreads == 0)
{
}
else if (!m_listOfTables.isEmpty())
{
for (int i = 0; i < maxReplicationThreads && !m_listOfTables.isEmpty();i++)
{
QThread *thread = new QThread;
QPointer<vcSharedDataQt> worker = new vcSharedDataQt();
worker->moveToThread(thread);
QString tmpTableName (m_listOfTables.dequeue());
worker->setParentObject(this);
//
// set properties on the worker object.
//
connect(thread, SIGNAL(started()), worker, SLOT(process()));
connect(worker, SIGNAL(finished()), thread, SLOT(quit()));
connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), thread,SLOT(deleteLater()));
connect(worker,
SIGNAL(updateMessageFromThread( const QString&,
const QString&,
const QString&,
const QString&,
const QString&,
const QString&,
const QString&)),
this,
SLOT(UpdateStatusBarFromThread(const QString&,
const QString&,
const QString&,
const QString&,
const QString&,
const QString&,
const QString&)));
thread->setObjectName(worker->getUniqueKey());
thread->start();
currentReplicationThreads ++;
}
}
}
Стек не позволил бы мне ответить на этот вопрос так:
Функция была прикрытый QMutex
:
mutex.lock();
processWorkQueue();
mutex.unlock();
Это вызвало память протечь. QThread
, по-видимому, не может быть уничтожен при завершении рабочего потока. Я удалил мьютекс, и VLD сообщает об утечке памяти с QThread
.
Ваше использование 'QPointer' бессмысленно :) –
Какая версия Qt вы используете? (Поведение QThread deleteLater() изменилось вокруг 4.8.) –
Спасибо за обновление и комментарии: Open - QT 5.2.0 –