2012-06-13 104 views
1

我已经使用MSVC2008从源码构建Qt,因为它建议避免任何不兼容问题。当我使用返回QList对象的Qt函数时,我遇到了问题。Qt在使用QList时崩溃(堆损坏)

QList<QNetworkInterface> *netInterfaces = new QList<QNetworkInterface>; 
*netInterfaces = QNetworkInterface::allInterfaces(); 
delete netInterfaces; 

该代码将始终“删除netInterfaces”在free.c试图以释放内存时崩溃。它指出堆已损坏,我不知道为什么,因为所有东西都是用相同版本的MSVC编译的。

它发生的返回,甚至当我只需要调用该函数的QList对象Qt的所有功能:

QNetworkInterface::allInterfaces(); 

通过上面的代码,应用程序将总是立即试图通过Qt的分配空闲堆时崩溃。奇怪的是,这只发生在Debug版本中。发布版本工作正常,没有任何崩溃。

我的Qt 4.8.0使用/ MT(多线程)编译,我动态链接到库。我的应用程序也被编译为多线程。

有没有人知道这可能是什么原因造成的问题?

+0

我想我已经找到了解决我的问题在这里:http://qt-project.org/forums/viewthread/16513任何人都可以确认吗? – blackd0t

+0

确保您不要混用版本和调试版本。使用[dependency walker](http://www.dependencywalker.com/)确认可执行文件仅与运行时的一个副本链接。 –

回答

2

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

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

我在这里可能会出现一些错误,但我希望至少该解决方案能够帮助一些找到此线程的人。我在互联网上看到了不少人遇到这个问题,关键是要真正理解,当使用/ MT标记构建时,不应链接共享库。/MD会很好。

这里是我发现的线程开导我:http://qt-project.org/forums/viewthread/16513

干杯!

+0

Qt没有任何堆分配器!我*可*可执行文件间接链接到两个运行时库,因为Qt和您的应用程序是针对不同的运行时间链接的。你不需要静态编译Qt。 –