Ho appena fornito una risposta per la domanda this e ho voluto fornire un esempio funzionante quando ho notato che l'istanza di nuova creazione QMimeData
restituita da QListModel::mimeData()
non verrà eliminata fino alla chiusura dell'applicazione.Perdita di memoria in Qt5? Come si può eliminare QMimeData?
Quindi questo non è un perdita di memoria reale dal Qt gestisce tutte le istanze QMimeData
allo spegnimento, ma si avrà solo a trascinare lungo & goccia abbastanza e mettere il contenuto giusto nei vostri dati MIME per far correre la memoria piena.
Mi sono perso qualcosa? C'è un modo per dire a Qt di eliminare le istanze QMimeData
non appena non sono più necessarie?
Si prega di notare:
So che ogni istanza di QMimeData
viene eliminato da Qt automaticamente al termine del programma. Il mio problema qui non è una vera perdita di memoria, come riportato da valgrind
o cppcheck
ma sembra che le istanze multiple e potenzialmente molto grandi di QMimeData
non vengano ripulite in fase di runtime che fa esplodere anche il consumo di memoria.
Esempio di codice:
#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();
}
uscita Esempio simile a questo:
0xa58750
0xa4e0f0
~0xa4e0f0
0xa3c6c0
~0xa3c6c0
0xa51880
0xa5ecd0
0xa31f50
0xa57db0
0xa5afc0
~0xa5afc0
0xa5aa70
~0xa5aa70
------ CLOSE WINDOW
~0xa58750
~0xa51880
~0xa5ecd0
~0xa31f50
~0xa57db0
I distruttori vengono chiamati prima chiudere l'applicazione solo quando ha accettato il get goccia.
Btw. Sono su un Qt domestico 5.6 @ 1fcdb6cafcf - su un computer e su 5.6.0-19.fc23 Fedora 23 precompilato su un altro. Quindi dubito che sia solo uno stato di sviluppo temporaneo.
'QMimeData' eredita' QObject' e memorizza internamente i propri dati come 'QVector' di stringhe e' coppie QVariant'. Ha gli stessi limiti di gestione della memoria rispetto ad altre esperienze di classe derivate da 'QObject'. –
'cppcheck' non ha trovato nulla in questo esempio perché l'istanza' QMimeData' viene eliminata alla fine. Ma fino ad allora avrei potuto immagazzinare gigabyte di dati in migliaia di istanze di nuove istanze di 'QMimeData' - che è - lo ammetto - non una perdita di memoria classica. – frans
In realtà stai vedendo un consumo eccessivo di memoria, o semplicemente preoccupato che possa accadere? –