QString :: toStdString()在std :: string析构函数上崩溃

时间:2013-03-25 09:01:50

标签: c++ visual-studio qt crash

我现在已经调试了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

3 个答案:

答案 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;运行时库”中找到它