首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用QList时Qt崩溃(堆损坏)

使用QList时Qt崩溃(堆损坏)
EN

Stack Overflow用户
提问于 2012-06-13 21:19:32
回答 1查看 2.7K关注 0票数 1

我使用MSVC2008从源代码中构建了Qt,这是为了避免任何不兼容问题。但是,在使用返回QList对象的Qt函数时,我遇到了问题。

代码语言:javascript
运行
复制
QList<QNetworkInterface> *netInterfaces = new QList<QNetworkInterface>;
*netInterfaces = QNetworkInterface::allInterfaces();
delete netInterfaces;

当试图释放内存时,此代码总是会崩溃在"delete netInterfaces"中。它声明堆已损坏,我不知道为什么,因为所有内容都是用相同版本的MSVC编译的。

所有返回QList对象的Qt函数都会发生这种情况,即使我只是调用该函数:

代码语言:javascript
运行
复制
QNetworkInterface::allInterfaces();

使用上面的代码,当尝试释放Qt分配的堆时,应用程序总是会立即崩溃。奇怪的是,这种情况只发生在Debug构建中。版本构建在没有任何崩溃的情况下运行良好。

我的QT4.8.0是用/MT (多线程)编译的,我动态地链接到库。我的应用程序也被编译为多线程。

有谁知道这个问题的可能原因吗?

EN

回答 1

Stack Overflow用户

发布于 2012-06-14 10:58:18

我已经找到了解决问题的办法。显然,Qt有它自己的一组堆分配器,当我有一个多线程(/MT)构建和一个共享库时,Qt将使用它们自己的内存处理程序在DLL中分配堆。在Qt分配这个内存之后,我的应用程序试图在我自己的代码中释放这些内存块,这会导致崩溃,因为Qt和主应用程序之间的堆结构不同。

我用/MT标志重新构建了Qt,但现在我生成了一个静态库,而不是共享库。在我将Qt静态地链接到我的应用程序之后,所有堆问题都神奇地消失了。

我在这里的解释可能有点错误,但我希望这个解决方案至少能帮助一些找到这条线索的人。我见过很多人在互联网上有这个问题,关键是要真正理解,当共享库是用/MT标记构建时,不应该链接它。/MD会很好的。

这是我发现的启发我的线索:http://qt-project.org/forums/viewthread/16513

干杯!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11023461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档