【问题标题】:Qt crashes when using QList (heap corruption)使用 QList 时 Qt 崩溃(堆损坏)
【发布时间】:2012-06-13 21:19:32
【问题描述】:

我已使用 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(多线程)编译的,我动态链接到库。我的应用程序也被编译为多线程。

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

【问题讨论】:

标签: qt qt4 crash qlist


【解决方案1】:

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

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

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

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

干杯!

【讨论】:

  • Qt 没有任何堆分配器!我打赌您的可执行文件间接链接到两个运行时库,因为 Qt 和您的应用程序链接到不同的运行时。你不需要静态编译 Qt。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 2013-12-04
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多