Speicher aufräumen

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
simon.hain
Beiträge: 10
Registriert: 30. August 2012 14:03

Speicher aufräumen

Beitrag von simon.hain » 23. Oktober 2012 10:45

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?

franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Speicher aufräumen

Beitrag von franzf » 23. Oktober 2012 11:22

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!

simon.hain
Beiträge: 10
Registriert: 30. August 2012 14:03

Re: Speicher aufräumen

Beitrag von simon.hain » 23. Oktober 2012 11:30

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?

brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: Speicher aufräumen

Beitrag von brax » 24. Oktober 2012 14:04

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.

simon.hain
Beiträge: 10
Registriert: 30. August 2012 14:03

Re: Speicher aufräumen

Beitrag von simon.hain » 24. Oktober 2012 14:08

Vielen Dank an euch beide!
Aktuell funktioniert alles :D

Antworten