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

QString::toStdString() crashes on std::string destructor

本文关键字:string 析构函数 崩溃 std toStdString QString      更新时间:2023-10-16

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

您的Qt dll需要使用STL支持和与您的代码完全相同的C-Runtime库进行编译。看起来好像您同时使用了两个不同的crt,这会将Qt在一个堆上创建的对象销毁到您的程序使用的堆中。

使用依赖项检查器检查DLL使用情况!

最可能的原因可能是您的运行时库是"多线程(/MT)",您需要将其更改为"多线程DLL (/MD)"(如果您使用的是发布版本)

如果你是在调试版本从"多线程调试(/MTd)"更改为"多线程调试DLL (/MDd)"

如果你有一个奇怪的Qt编译,解决方案应该是相反的。

你会发现在"配置属性->C/c++ ->代码生成->运行时库"

我尝试用不同的方法解决这个问题。我在Visual Studio中创建了一个新项目,测试代码没有在那里崩溃。在检查*。vcproj文件与WinMerge,我发现崩溃是由一些自定义的变化引起的项目有关-你猜对了-运行时库。这是由WinMerge创建的补丁,具有导致崩溃重现的最小差异:

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