[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Qt - Memory Leak?



hi

On Wed, 09 Jul 2003 23:49:13 +0200
Andreas Pakulat <ap125@informatik.uni-rostock.de> wrote:

> On 09.Jul 2003 - 20:26:50, Patrick Schnorbus wrote:
> > Mir ist etwas aufgefallen:
> > 
> > 1) Ein Programm oeffnen, welches QTextEdit benutzt (z.B. kwrite)
> > 2) Mit top o.ae. den Speicherverbrauch messen.
> > 3) Viel Text einfuegen, so dass der Speicherverbrauch hochgeht.
> > 4) Den Text wieder entfernen
> > 5) Der Speicherverbrauch bleibt konstant oben.
> > 
> > Es scheint so, als ob sich QTextEdit bei Bedarf neuen Speicher zwar
> > allokiert, ihn aber nicht wieder freigibt, wenn er nicht mehr
> > benoetigt wird. Kann das jemand reproduzieren?
> > Ich verwende Woody mit Qt 3.1.2.

Das ist durchaus drin. Wenn es dich stört, würde ich einen eigenen
Editor schreiben. Zum Speichern des Inhaltes kannst du zum Beispiel eine
STL Rope verwenden.

Wenn das doch zu viel Aufwand ist, so lösche das QTextEdit und erzeuge
ein neues.

QString old=mytextedit->text();
delete mytextedit;
mytextedit = new QTextEdit (this);
mytextedit->setText(old);
foolayout->insertbla(mytextedit,bla);

irgendwie so.

Eine ordentliche Editor Speicherverwaltung wäre zum Beispiel:

Sobald der Edit Puffer überläuft, verdoppele seine größe.

Sobald der Edit Puffer nur ein Viertel gefüllt ist, halbiere seine
größe.

Aber eine STL Rope sollte einfacher sein als alles selber zu machen und
auch effizienter. Ich selbst habe für einen Editor mal zwei
Auslagerungsstapeldateien verwendet. Der Bereich, der gerade editiert
wird ist im Speicher. Er ist aber nicht größer als 32 KB (war ein
DOS-Editor). Wenn man ein Zeichen einfügt, so werden die Zeichen in
diesem Puffer nach rechts umkopiert und das Zeichen an der richtigen
Stelle eingefügt. Läuft der Puffer über, so wird das Überlaufende auf
den linken oder rechten Auslagerungsstapel gesetzt. Will man auf Zeichen
links vom Puffer zugreifen, so wird rechts ausgelagert und links
eingelagert (immer eine gewisse PAGESIZE gross), bis man angekommen ist.
Ergo ist insert und delete immer gleicheffizient, egal wieviele
Terrabytes der Text gross ist. Aber wehe du moechtest an den anfang oder
das ende der datei springen, dann musst du die ganzen Stapel
durchrollen. Übrigens ist Laden und Speichern solcher Files auch mit
einem durchrollen verbunden... Die STL Rope ist irgendwie so ähnlich,
nur aber komplett im Speicher. Aber evtl. kann man das korrigieren. Doku
ist ziemlich gut.

Übrigens das mit dem QTextEdit ist kein Memory Leak, denn der delete des
QTextEdit gibt den Speicher frei. Aber wenn du deine Qt-Programme mal
mit "valgrind" (debian paket) laufen lässt, so findest du echte Leaks
:-)


cya!
erik


-- 
Erik Thiele



Reply to: