Qt5内存泄漏?如何删除QMimeData?

fra*_*ans 5 c++ qt memory-leaks ownership

我刚刚为这个问题提供了一个答案,并希望提供一个工作示例,当我发现QMimeData返回的新创建的实例QListModel::mimeData()在应用程序终止之前不会被删除.

所以这不是一个真正的内存泄漏,因为Qt处理QMimeData关闭时的所有实例,但你只需要拖放足够长的时间并将正确的内容放入你的mime数据中以让内存运行满.

我错过了什么?有没有办法告诉Qt QMimeData一旦不再需要它们就立即删除它们?

请注意:

我知道QMimeDataQt会在程序终止时自动删除每个实例.我在这里的问题不是所报告的真实内存泄漏valgrindcppcheck但它看起来像多和潜在的非常大的QMimeData情况下,获得在运行时不会吹灭了内存消耗和清理.

示例代码:

#include <QtWidgets>
#include <iostream>

struct TrackedMimeData : public QMimeData {
   TrackedMimeData(const QString & text) {
      std::cout << this << std::endl;
      setText(text);
   }
   ~TrackedMimeData() {
       std::cout << "~" << this << std::endl;
   }
};

struct MyListWidget : QListWidget {
   MyListWidget() {
      setDragEnabled(true);
      addItem("item1");
      addItem("item2");
   }
   QMimeData * mimeData(const QList<QListWidgetItem *>) const override {
      return new TrackedMimeData("hello");
   }
};

int main(int argsc, char *argsv[]) {
   QApplication application(argsc, argsv);
   MyListWidget gui;
   gui.show();
   return application.exec();
}
Run Code Online (Sandbox Code Playgroud)

示例输出如下所示:

0xa58750
0xa4e0f0
~0xa4e0f0
0xa3c6c0
~0xa3c6c0
0xa51880
0xa5ecd0
0xa31f50
0xa57db0
0xa5afc0
~0xa5afc0
0xa5aa70
~0xa5aa70
------ CLOSE WINDOW
~0xa58750
~0xa51880
~0xa5ecd0
~0xa31f50
~0xa57db0
Run Code Online (Sandbox Code Playgroud)

只有当drop get被接受时才会在关闭应用程序之前调用析构函数.

顺便说一句.我在一台本土的Qt 5.6 @ 1fcdb6cafcf上 - 在一台计算机上和5.6.0-19.fc23 Fedora 23预编译在另一台计算机上.所以我怀疑它只是一个临时的发展状态.

gal*_*tte 2

仅当您忘记删除 所返回的指针时,才会出现内存泄漏mimeData()。您必须像管理任何指针一样管理所有权。

例如,如果您使用mimeData()返回的指针传递给一个QDrag对象setMimeData(),他将获得该对象的所有权,并在拖动操作结束时删除它。在这种情况下不存在内存泄漏。

请参阅: http: //doc.qt.io/qt-5/qdrag.html#setMimeData