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
.
Ответы
Ответ 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/С++ → Генерация кода → Библиотека времени выполнения"