QString::toStdString()在std::string析构函数上崩溃
QString::toStdString() crashes on std::string destructor
我已经调试了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"
相关文章:
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 无法手动调用 std::string 的析构函数
- 您是否需要析构函数来销毁全局 int、float 或 std::string 变量
- 仅在调试时std::string析构函数中存在访问冲突
- 为什么 std::string 没有虚拟析构函数
- 在析构函数上自动安全地清除c++ std::string和std::vector的内容
- std::string会删除在析构函数中通过assign方法获得的内容吗?
- QString::toStdString()在std::string析构函数上崩溃