[gelöst] Auto-delete eines Objektes
[gelöst] Auto-delete eines Objektes
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.
Re: Auto-delete eines Objektes
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 ...
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 ...
Re: Auto-delete eines Objektes
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.