Подтвердить что ты не робот

QString:: toStdString() выходит из строя на std::string деструкторе

Я отлаживал это в течение 2 часов, и это сводится к этому. Если я назову QString::toStdString

QString s = "testtesttesttesttesttest";
const std::string &temp = s.toStdString();

позже программа выйдет из строя на std::string деструкторе

__CLR_OR_THIS_CALL ~basic_string()
    {   // destroy the string
    _Tidy(true); // <---- It crashes on this line.
    }

Сначала я думал, что это повреждение памяти, но это происходит, даже если main() содержит только эти 2 строки. Кто-нибудь знает, почему это происходит, и как я могу это исправить?

Моя версия Qt 4.8.1.

4b9b3361

Ответ 1

Ваши Qt DLL должны быть скомпилированы с поддержкой STL и точно такой же C-Runtime Library, что и ваш код. Похоже, что вы одновременно используете два разных ЭЛТ, которые уничтожат объекты, созданные в одной куче Qt, в кучу, используемую вашей программой.

Проверьте использование DLL с помощью Walker Dependency!

Ответ 2

Я попытался решить проблему по-другому. Я создал новый проект из Visual Studio, и тестовый код там не разбился. Изучив различия между файлами *.vcproj с WinMerge, я обнаружил, что авария вызвана некоторыми пользовательскими изменениями в проекте, которые, как вы догадались, - библиотеками времени выполнения. Это патч, созданный WinMerge с минимальными различиями, которые приводят к сбою при сбое:

112c112
<               RuntimeLibrary="3"
---
>               RuntimeLibrary="1"
126a127,128
>               LinkLibraryDependencies="true"
>               UseLibraryDependencyInputs="false"
127a130,131
>               IgnoreAllDefaultLibraries="false"
>               IgnoreDefaultLibraryNames="msvcrtd.lib"

Ответ 3

Наиболее вероятной причиной может быть то, что ваша Runtime Library является "Multi-threaded (/MT)", и вам нужно изменить ее на "Multi-threaded DLL (/MD)" (если вы находитесь в выпуске)

Если вы используете версию отладочной версии "Многопотоковая отладка (/MTd)" в "Многопоточная отладка DLL (/MDd)"

Если у вас есть нечетная компиляция Qt, решение должно быть обратным.

Вы найдете, что в разделе "Свойства конфигурации → C/С++ → Генерация кода → Библиотека времени выполнения"