我已经从MSVC2008的来源构建了Qt,因为建议避免任何不兼容问题。我在使用返回QList对象的Qt函数时遇到了问题。
QList<QNetworkInterface> *netInterfaces = new QList<QNetworkInterface>;
*netInterfaces = QNetworkInterface::allInterfaces();
delete netInterfaces;
当尝试释放内存时,此代码将始终在free.c中的“delete netInterfaces”中崩溃。它声明堆已损坏,我不知道为什么,因为所有内容都是使用相同版本的MSVC编译的。
对于所有返回QList对象的Qt函数都会发生这种情况,即使我只是调用函数:
QNetworkInterface::allInterfaces();
使用上面的代码,当尝试释放由Qt分配的堆时,应用程序将始终立即崩溃。 奇怪的是,这只发生在Debug构建中。版本构建工作正常,没有任何崩溃。
我的Qt 4.8.0是用/ MT(多线程)编译的,我动态链接到库。我的应用程序也编译为多线程。
有谁知道这个问题的可能原因是什么?
答案 0 :(得分:2)
我找到了解决问题的方法。显然Qt拥有自己的堆分配器集,虽然我有一个多线程(/ MT)构建和共享库,Qt会在DLL中使用自己的内存处理程序分配堆。在这个内存由Qt分配后,我的应用程序试图在我自己的代码中释放这些内存块,导致崩溃,因为Qt和主应用程序之间的堆结构不同。
我用/ MT标志重建了Qt,但现在我生成了一个静态库而不是共享库。在我将Qt与我的应用程序静态链接后,所有堆问题都神奇地消失了。
我的解释可能有点错误,但我希望至少解决方案可以帮助一些找到这个帖子的人。我已经看到很多人在互联网上遇到这个问题,关键是要真正明白,当用/ MT标志构建时,你不应该链接共享库。 / MD完全没问题。
以下是我发现启发我的帖子:http://qt-project.org/forums/viewthread/16513
干杯!