14

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

4

3 回答 3

11

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

使用 Dependency Walker 检查 DLL 使用情况!

于 2013-03-25T09:23:40.517 回答
1

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

如果您正在调试版本,请从“多线程调试 (/MTd)”更改为“多线程调试 DLL (/MDd)”

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

您会在“配置属性->C/C++->代码生成->运行时库”中找到它

于 2016-03-23T20:36:17.643 回答
0

我尝试以不同的方式解决问题。我从 Visual Studio 创建了一个新项目,并且测试代码没有在那里崩溃。在使用 WinMerge 检查 *.vcproj 文件之间的差异后,我发现崩溃是由项目中的一些自定义更改引起的 - 你猜对了 - 运行时库。这是 WinMerge 创建的补丁,其中包含导致崩溃重现的最小差异:

112c112
<               RuntimeLibrary="3"
---
>               RuntimeLibrary="1"
126a127,128
>               LinkLibraryDependencies="true"
>               UseLibraryDependencyInputs="false"
127a130,131
>               IgnoreAllDefaultLibraries="false"
>               IgnoreDefaultLibraryNames="msvcrtd.lib"
于 2013-03-26T08:55:12.197 回答