Slt, j'ai toujours du mal à y croire mais je crois avoir trouvé deux bugs dans la bibliothèque de Qt.... Je suis avec la version 4.5 de Qt, la dernière à ce jour. Ce bug concerne la classe QTreeWidgetItem
Il semblerait que si je crée un objet de ce type, que je fais une boucle pour lui ajouter énormément de fils (assez pour voir une utilisation de la RAM augmenter) et que je fasse un delete de cet objet, Qt ne libére pas la mémoire de tous ses fils... Il appelle bien le delete sur tous ses fils mais la mémoire n'est pas libérée... Je me suis fait une petite classe test qui peut avoir des fils un peu dans le même genre et dans le destructeur, je détruis tous les fils et là, toute la mémoire est bien libérée. Pourquoi pas avec le QTreeWidgetItem ? Le problème vient de moi ou de Qt ?
Exemple de code, surveillez votre utilisation de la RAM :
J'ai créé une classe qui dérive de QTreeWidgetItem et j'ai mis un débug dans le destructeur et le destructeur de tous les fils est bien appelé... Pourquoi cette mémoire n'est donc pas libérée ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 #include <QApplication> #include <QTreeWidgetItem> int main(int argc, char *argv[]) { QApplication a(argc, argv); QTreeWidgetItem * Root = new QTreeWidgetItem(&w); for(int i = 0; i < 10000; ++i) { Root->addChild(new QTreeWidgetItem()); for(int j = 0; j < 30; ++j) Root->child(i)->addChild(new QTreeWidgetItem(Root)); } qDebug("Debut sleep ");// Utilisation forte de la memoire sleep(5); qDebug("Fin sleep, debut delete"); delete Root; qDebug("Fin delete");// devrait avoir une utilisation de la ram // d'environ 3Mo... Mais ce n'es pas le cas... sleep(10000000); return a.exec(); }
Merci d'avance pour vos réponses !
Cordialement.
Partager