[gelöst] Auto-delete eines Objektes

Alles rund um die Programmierung mit Qt
Antworten
bobcat
Beiträge: 125
Registriert: 21. April 2010 14:51

[gelöst] Auto-delete eines Objektes

Beitrag von bobcat »

Ich habe eine Methode, die z.B. einen QString erzeugt und einen Zeiger darauf zurückgibt. Über diesen Zeiger wird das Objekt an mehreren Stellen verwendet. Wenn kein Zeiger auf das Objekt in meinem Programm mehr existiert, möchte ich das Objekt automatisch löschen. Gibt's dafür eine Architektur in Qt?
Zuletzt geändert von bobcat am 19. November 2015 09:18, insgesamt 1-mal geändert.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Auto-delete eines Objektes

Beitrag von RHBaum »

Generell gibt es sowas klar ^^

Alle von QObject abgeleiteten klassen können das, wenn sie einen parent haben. Dann wird beim löschen des parents, alle Childs mitgelöscht.
Das aber nur als Hinweis am Rande, für den Fall das du selbiges fuer widget klassen etc sucht.

Für strings ist es nicht relevant, weil string kein QObject ist.

Für alle structuren bietet der c++(std::shared_pointer, std::unique_pts ... ) und Qt (QSharedPointer )auch da das Konzept der Shared Pointer, oder intelligente Zeiger.
Deren hauptsächlichste Daseinsberechtigung ist das audomatische Löschen (Auto delete) nach nicht mehr gebrauch.
Aber das auch nur als Hinweis, weil für QStrings die Sache anders tickt.

Für structuren mit viel speicher und Klassen die 1:1 Speicherallocationhaben (std::string z.b.) wären die shared pointer ne Lösung.

Aber QString ist keine 1:1 Speicher klasse, sondern ist, im Qt Jargon, impliziet shared.
Das heisst, der Stub aufn Stack verwaltet den dynamischen anteil (die eigentlichen daten) aufm heap zwar ähnlich wie der std::string. Hat aber auch nen eingebaute intelligenz.
Das heisst, die Daten aufn heap werden wirklich nur kopiert, wenn eine kopie benoetigt wird (bestimmt die Qt philosophie, nicht du).
Das heisst nen Zuweisung auf QString ebene macht gar keine kopie, sondern erzeugt 2 verwaltungsobjecte(stubs) die auf die selben Daten aufn heap zeigen.
d.h. das ding ist eigentlich schon nen intelligenter Zeiger. und hat speichertechnisch mehr gemeinsam mit nem std::shared_ptr als mit nem std::string

Also vrgiss das mit dem QString, der optimiert schon für dich ...
Also gib niemals nen Zeiger auf nen QString zurück, sondern den QString selber ... und lass qt den rest machen.

und für alle anderen nicht impliziet shared klassen (die es in Qt kaum gibt), nimm die Smartpointer ...
natürlich nur wenn der call nicht ueber dll grenzen (übersetzungseinheit) geht

Ciao ...
bobcat
Beiträge: 125
Registriert: 21. April 2010 14:51

Re: Auto-delete eines Objektes

Beitrag von bobcat »

Vielen Dank für die ausführliche Antwort. Meine Implementierung musste tatsächlich einen Zeiger auf ein Datenobjekt zurückgeben (das bei mir ein QString war, das lag an einer Schnittstelle, die ich zu implementieren hatte, aber Details führen grad zu weit). Ich hab's dann letztlich so gelöst, dass ich die Erzeugung (und damit auch die Verwaltung) der QStrings aus der Methode an eine andere Stelle ausgelagert habe. Ist mehr Aufwand, aber vermutlich sauberer.
Antworten