我使用MSVC2008从源代码中构建了Qt,这是为了避免任何不兼容问题。但是,在使用返回QList对象的Qt函数时,我遇到了问题。
QList<QNetworkInterface> *netInterfaces = new QList<QNetworkInterface>;
*netInterfaces = QNetworkInterface::allInterfaces();
delete netInterfaces;当试图释放内存时,此代码总是会崩溃在"delete netInterfaces"中。它声明堆已损坏,我不知道为什么,因为所有内容都是用相同版本的MSVC编译的。
所有返回QList对象的Qt函数都会发生这种情况,即使我只是调用该函数:
QNetworkInterface::allInterfaces();使用上面的代码,当尝试释放Qt分配的堆时,应用程序总是会立即崩溃。奇怪的是,这种情况只发生在Debug构建中。版本构建在没有任何崩溃的情况下运行良好。
我的QT4.8.0是用/MT (多线程)编译的,我动态地链接到库。我的应用程序也被编译为多线程。
有谁知道这个问题的可能原因吗?
发布于 2012-06-14 10:58:18
我已经找到了解决问题的办法。显然,Qt有它自己的一组堆分配器,当我有一个多线程(/MT)构建和一个共享库时,Qt将使用它们自己的内存处理程序在DLL中分配堆。在Qt分配这个内存之后,我的应用程序试图在我自己的代码中释放这些内存块,这会导致崩溃,因为Qt和主应用程序之间的堆结构不同。
我用/MT标志重新构建了Qt,但现在我生成了一个静态库,而不是共享库。在我将Qt静态地链接到我的应用程序之后,所有堆问题都神奇地消失了。
我在这里的解释可能有点错误,但我希望这个解决方案至少能帮助一些找到这条线索的人。我见过很多人在互联网上有这个问题,关键是要真正理解,当共享库是用/MT标记构建时,不应该链接它。/MD会很好的。
这是我发现的启发我的线索:http://qt-project.org/forums/viewthread/16513
干杯!
https://stackoverflow.com/questions/11023461
复制相似问题