1

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

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

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

即使我只是调用函数,它也会发生在所有返回 QList 对象的 Qt 函数中:

QNetworkInterface::allInterfaces();

使用上面的代码,当试图释放 Qt 分配的堆时,应用程序总是会立即崩溃。奇怪的是,这只发生在 Debug 版本中。发布构建工作正常,没有任何崩溃。

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

有谁知道这里问题的可能原因是什么?

4

1 回答 1

2

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

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

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

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

干杯!

于 2012-06-14T10:58:18.467 回答