ich arbeite momentan an einem Programm, das eine größere Menge Daten halten und visualisieren soll. Da ich bei der Visualisierung zu Qt gegriffen habe, lag es nahe zur Datenhaltung die Klassen der QTL (QList, QMap, etc.) an Stelle der STL zu verwenden.
Leider bin ich dabei auf ein Problem gestoßen, was den Speicherverbrauch betrifft. Ich habe in meinem Programm eine Klasse (im Beispielcode "MyData"), welche als Attribut eine QStringList besitzt. Ein Container (im Beispielcode "MyDataContainer") hält eine Liste mit Zeigern auf MyData-Objekte. Diese Objekte sollen beim Löschen des Containers ebenfalls gelöscht werden. Erzeuge ich nun mit new eine Reihe von MyData-Objekten und packe sie in die Container-Klasse steigt logischerweise der Speicherverbrauch meine Programms. Nun sollte man aber annehmen, dass beim Löschen des Containers der allokierte Speicher wieder freigegeben wird, was aber nicht der Fall ist.
Der angehängt Beispielcode veranschaulicht das Problem. Ich erzeuge 1000000 MyData-Objekte (mit QStringList-Attribut), wobei hier bei mir der Speicherverbrauch auf ca. 20 MB steigt. Nach Freigabe des Containers müsste der Verbrauch wieder auf nahezu 0 MB abfallen. Stattdessen bleiben auf dem Heap aber weiterhin 16 MB! Da ich in meinem Programm weit größere Container habe als 20 MB, läuft mir so ziemlich schnell der Speicher voll, da eine Freigabe des Containers nahezu keine Wirkung hat. Was macht Qt also an dieser Stelle?
Ich habe gesehen, dass Qt bei QString, QList, QStringList und weiteren Klassen sogenanntes implizites Sharing betreibt (http://doc.trolltech.com/shared.html) aber selbst hierbei sollte ja Speicher, auf den nicht mehr referenziert wird, freigegeben werden. Momentan bin ich also ziemlich ratlos, insbesondere auch deshalb weil die Speicherfreigabe funktioniert, wenn ich den MyData* Zeiger anstatt in den Container zu packen, gleich wieder lösche (siehe Beispielcode Zeile 69 und 70).
Weiß hierzu jemand Rat? Bevor ich einen Bugreport schreibe, wäre es außerdem gut zu wissen, ob das Problem bei anderen ebenso auftritt.
Als kleine Info zum System:
Ich verwende Qt 4.5 unter Ubuntu 9.04 mit dem GCC:
Code: Alles auswählen
$g++ -v
Es werden eingebaute Spezifikationen verwendet.
Ziel: i486-linux-gnu
Konfiguriert mit: ../src/configure -v --with-pkgversion='Ubuntu 4.3.3-5ubuntu4' --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-targets=all --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread-Modell: posix
gcc-Version 4.3.3 (Ubuntu 4.3.3-5ubuntu4)http://qtforum.de/forum/viewtopic.php?p ... ght=#51138