Seite 1 von 1

Speicher aufräumen

Verfasst: 23. Oktober 2012 10:45
von simon.hain
Ich habe ein paar Fragen zu Pointern, die Grundlagen habe ich hoffentlich verstanden.

Ich habe ein QHash mit QString als key und Pointern als values.
Wenn ich auf dem Hashtable clear() aufrufe, muss ich dann vorher alle Pointer rausholen und delete aufrufen? Und den Dekonstructor von dem referenzierten Objekt?
Da das ja alles Qt-basiert ist: Könnte ich da auch den Qt Object Tree verwenden um das automatisch machen zu lassen?

Re: Speicher aufräumen

Verfasst: 23. Oktober 2012 11:22
von franzf
Für QHash gilt selbiges wie für alle container: Sie zerstören die _Objekte_ die darin abgelegt werden. Damit werden auch die Pointer aufgeräumt.
Allerdings ist das nicht was du willst - Pointer aufräumen reicht nicht, es sollen ja die Objekte hinter den Pointern zerstört werden. Und DAS macht kein container (außer die aus boost::ptr_container ;))

Deshalb ein kleiner Leitfaden:
1) Keine pointer abspeichern wenn es auch values tun.
2) Klaren Besitz definieren: normalerweise kümmert sich der um die Freigabe, der auch den Speicher anfordert.
3) Kommen die Pointer z.B. aus factories sollte auch der zerstören der die Pointer anfordert/speichert.

Ich denke du hast 3). Demnach muss der zerstören, der die QHash hält. Das machst du natürlich BEVOR du die map leerst ;)
Beachte aber auch 2): Sammelst du an der Stelle nur Zeiger, "besitzt" werden sie aber an anderer Stelle, sollten die Zeiger auch dort und nicht über die hash gelöscht werden!

Re: Speicher aufräumen

Verfasst: 23. Oktober 2012 11:30
von simon.hain
Ich werde mal sehen an welchen Stellen ich die Zeiger durch Objekte ersetzen kann.
Bei einigen Stellen hat das Hashtable den Typ einer Oberklasse und es werden deswegen nur Zeiger benutzt (da sonst die Unterklassen gesliced werden).

Vor dem clear gehe ich also die Zeiger durch und lösche die Objekte dahinter, zumindest bei den Hashtables wo ich nicht auch Objekte statt Zeigern nehmen kann, korrekt?

Re: Speicher aufräumen

Verfasst: 24. Oktober 2012 14:04
von brax
simon.hain hat geschrieben: Vor dem clear gehe ich also die Zeiger durch und lösche die Objekte dahinter, zumindest bei den Hashtables wo ich nicht auch Objekte statt Zeigern nehmen kann, korrekt?
Korrekt
simon.hain hat geschrieben: Und den Dekonstructor von dem referenzierten Objekt?
Mach das bloß nicht! Den destructor von Hand aufzurufen sollte man nur machen, wenn man wirklich weiß, was man macht. Er wird beim Aufruf von delete automatisch ausgeführt.

Re: Speicher aufräumen

Verfasst: 24. Oktober 2012 14:08
von simon.hain
Vielen Dank an euch beide!
Aktuell funktioniert alles :D