我剛剛提供了this問題的答案,並且希望提供一個工作示例,當我注意到新創建的QMimeData
實例返回的QListModel::mimeData()
在應用程序終止之前不會被刪除。Qt5中的內存泄漏?如何讓QMimeData被刪除?
所以這不是一個真正的內存泄漏,因爲Qt的處理上關閉所有QMimeData
實例,但你只需要拖動&滴足夠長的時間,把正確的內容爲您的MIME數據,讓內存運行完整。
我錯過了什麼嗎?有沒有辦法告訴Qt在不再需要時立即刪除QMimeData
實例?
請注意:
我知道的QMimeData
每個實例得到由Qt的程序終止自動刪除。 這裏的問題並不是真正的內存泄漏,如valgrind
或cppcheck
報告的,但它看起來像多個並且可能非常大的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();
}
輸出示例如下:
0xa58750
0xa4e0f0
~0xa4e0f0
0xa3c6c0
~0xa3c6c0
0xa51880
0xa5ecd0
0xa31f50
0xa57db0
0xa5afc0
~0xa5afc0
0xa5aa70
~0xa5aa70
------ CLOSE WINDOW
~0xa58750
~0xa51880
~0xa5ecd0
~0xa31f50
~0xa57db0
的析構函數被調用收盤前僅在降獲取的受理申請。
Btw。我在本地Qt 5.6 @ 1fcdb6cafcf - 在一臺計算機上,並在5.6.0-19.fc23 Fedora 23預編譯在另一臺計算機上。所以我懷疑這只是一個暫時的發展狀態。
'QMimeData'繼承'QObject'並在內部將其數據存儲爲字符串的'QVector'和'QVariant'對。它具有與其他'QObject'派生類體驗相同的內存管理限制。 –
'cppcheck'在本例中找不到任何東西,因爲'QMimeData'實例在最後被刪除。但是在那之前,我可能已經在成千上萬個新的'QMimeData'實例中存儲了千兆字節的數據 - 這是我承認的,而不是傳統的內存泄漏。 – frans
您是否真的看到過度的內存消耗,或者只是擔心會發生? –