Qt аварийно завершает работу при использовании QList (повреждение кучи)

Я собрал Qt из исходников с помощью MSVC2008, так как это было рекомендовано во избежание проблем с несовместимостью. Однако у меня возникла проблема при использовании функций Qt, которые возвращают объекты QList.

QList<QNetworkInterface> *netInterfaces = new QList<QNetworkInterface>;
*netInterfaces = QNetworkInterface::allInterfaces();
delete netInterfaces;

Этот код всегда будет давать сбой при удалении сетевых интерфейсов в free.c при попытке освободить память. В нем говорится, что куча повреждена, и я понятия не имею, почему, поскольку все было скомпилировано с одной и той же версией MSVC.

Это происходит для всех функций Qt, которые возвращают объекты QList, даже когда я просто вызываю функцию:

QNetworkInterface::allInterfaces();

С приведенным выше кодом приложение всегда будет немедленно падать при попытке освободить кучу, выделенную Qt. Странно то, что это происходит только со сборкой отладки. Релизная сборка работает нормально, без сбоев.

Мой Qt 4.8.0 был скомпилирован с /MT (многопоточный), и я динамически связываюсь с библиотекой. Мое приложение также скомпилировано как многопоточное.

Кто-нибудь знает, что может быть возможной причиной проблемы здесь?


person blackd0t    schedule 13.06.2012    source источник
comment
Я думаю, что нашел решение своей проблемы здесь: qt-project.org/forums/viewthread /16513 Кто-нибудь может подтвердить?   -  person blackd0t    schedule 14.06.2012
comment
Убедитесь, что вы не смешиваете выпускную и отладочную сборки. Используйте обходчик зависимостей, чтобы убедиться, что исполняемый файл связан только с одной копией среды выполнения.   -  person Kuba hasn't forgotten Monica    schedule 15.06.2012


Ответы (1)


Я нашел решение своей проблемы. По-видимому, у Qt есть собственный набор распределителей кучи, и хотя у меня была многопоточная (/MT) сборка и общая библиотека, Qt выделяла кучу, используя свои собственные обработчики памяти в DLL. После того, как эта память была выделена Qt, мое приложение пыталось освободить эти блоки памяти в моем собственном коде, что приводило к сбоям, поскольку структура кучи отличалась между Qt и основным приложением.

Я пересобрал Qt с флагом /MT, но теперь создал статическую библиотеку вместо общей. После того, как я статически связал Qt со своим приложением, все проблемы с кучей волшебным образом исчезли.

Я могу немного ошибаться в своем объяснении здесь, но я надеюсь, что хотя бы решение поможет некоторым людям, которые найдут эту тему. Я видел довольно много людей, сталкивающихся с этой проблемой в Интернете, и ключ в том, чтобы на самом деле понять, что вы не должны связывать общую библиотеку, когда она построена с флагом /MT. /MD было бы совершенно нормально.

Вот ветка, которая меня просветила: http://qt-project.org/forums/viewthread/16513

Ваше здоровье!

person blackd0t    schedule 14.06.2012
comment
Qt не имеет распределителей кучи! Я держу пари, что ваш исполняемый файл косвенно связан с двумя библиотеками времени выполнения, потому что Qt и ваше приложение связаны с разными средами выполнения. Вам не нужно статически компилировать Qt. - person Kuba hasn't forgotten Monica; 15.06.2012