我现在已经调试了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()
仅包含这两行,也会发生这种情况。有谁知道为什么会发生这种情况,我该如何解决?
我的Qt版本为4.8.1
。
答案 0 :(得分:9)
您的Qt DLL需要使用STL支持和与您的代码完全相同的C-Runtime库进行编译。看起来好像你在同一时间使用两个不同的CRT,这会将Qt在一个堆上创建的对象破坏到程序使用的堆中。
使用Dependency Walker检查DLL使用情况!
答案 1 :(得分:0)
我尝试以不同的方式解决问题。我从Visual Studio创建了一个新项目,测试代码没有崩溃。在检查* .vcproj文件与WinMerge之间的差异时,我发现崩溃是由项目中的一些自定义更改引起的 - 您猜对了 - 运行时库。这是由WinMerge创建的补丁,其最小差异导致崩溃再现:
112c112
< RuntimeLibrary="3"
---
> RuntimeLibrary="1"
126a127,128
> LinkLibraryDependencies="true"
> UseLibraryDependencyInputs="false"
127a130,131
> IgnoreAllDefaultLibraries="false"
> IgnoreDefaultLibraryNames="msvcrtd.lib"
答案 2 :(得分:0)
最可能的原因可能是您的运行时库是“多线程(/ MT)”,您需要将其更改为“多线程DLL(/ MD)”(如果您使用的是发行版)
如果您正在调试版本从“多线程调试(/ MTd)”更改为“多线程调试DLL(/ MDd)”
如果你有一个奇怪的Qt汇编,解决方案应该是相反的。
您会在“配置属性 - &gt; C / C ++ - &gt;代码生成 - &gt;运行时库”中找到它