Frage

Ich habe einige intermittierenden Segmentierungsfehler in einer Qt-Anwendung. Ich denke, das Problem zu unserem (sehr schlecht) Verwendung von QSharedPointer zusammenhängt. Die Qt Dokumentation Zustände :

QSharedPointer :: QSharedPointer (T * ptr): Erstellt eine QSharedPointer, dass Punkte auf ptr. Der Zeiger ptr wird durch diese QSharedPointer und verwaltet darf nicht auf ein anderes QSharedPointer Objekt übergeben werden oder gelöscht außerhalb dieses Objekt .

Ich denke, wir tun beide muss nicht ...: /

Gibt es eine OOP Art und Weise zu erzwingen, dass der Zeiger von QSharedPointer verwaltet werden, kann nicht auf einem anderen QSharedPointer gelöscht oder weitergegeben werden?

Die beste Lösung wird einen Compiler-Fehler haben.

War es hilfreich?

Lösung

Das normale Muster ist die new Anweisung innerhalb der Smart-Pointer-Konstruktor zu setzen, wie folgt aus:

QSharedPointer<Obj> p (new Obj(2)); 

So können Sie nie einen Verweis auf den nackten Zeiger selbst haben.

Wenn Sie Ihren Code Refactoring, so dass alle neuen Betreiber in Zeilen wie diese sind, werden alle Ihre Probleme gelöst werden.

Andere Tipps

Nun, eine OOP-artige Weise der Rohzeiger als privates Mitglied in einer Wrapper-Klasse zu schaffen wäre, und nur Aktionen auf dem Zeiger durch Methoden, die Handlung auf dem gemeinsamen Zeiger. irgendwie albern aber, nicht wahr?

Oder Sie könnten Ihre Klasse mit dem Rohzeiger eine Basisklasse zu Ihren anderen Klassen und machen den Rohzeiger ein privates Mitglied in der Klasse. In dieser Hinsicht sind Sie mehr oder weniger eine abstrakte Klasse zu schaffen, die nichts tut. Ihre Derivat Klassen müssen stattdessen die ganze Arbeit machen, und da sie nicht den Rohzeiger zugreifen können, werden Kompilierung fehlschlagen ... dies nicht zu stoppen jemand aus nur das Kopieren der rohen Zeigerwert aus dem gemeinsamen Zeiger, though.

Am Ende denke ich, die beste Politik ist es, manuall alle Funktionen zur Nutzung der betreffenden ändern entweder einen freigegebenen Zeiger oder auch einen rohen Zeiger. Sie können einen freigegebenen Zeiger auf einen anderen kopieren sicher, warum also nicht einfach so gehen?

Edit: Ich könnte, dass unabhängig davon hinzufügen, ob oder nicht Sie sind geteilt Zeiger verwenden, es klingt wie Sie mit Eigentumsfragen. Wenn ein Zeiger in einem Bereich erstellt wurde, sollte es in diesem Umfang gelöscht werden, es sei denn, die Funktion, dass es zu übergeben vertraglich Eigentum des Zeigers nimmt. Mit einem gemeinsamen Zeiger in diesem Szenario wird nur verschiedene Fehler verursacht, eventuell. Es klingt wie Sie Design-Fragen tiefer als nur den Austausch von Zeigern.

Ich bin mit der besonderen Qt Implementierung eines Shared-Zeiger nicht vertraut, aber als allgemeine Richtlinie: Sie versuchen, mit einem verwalteten Zeiger rohen Zeiger zu mischen endet in der Regel im Blut. Sobald Sie ‚Vertrauen‘ einen gemeinsamen Zeiger Implementierung in Besitz nimmt Ihre dynamisch zugewiesenen Daten, sollten Sie unter keinen Umständen versuchen, das Objekt Lebensdauer selbst zu verwalten (zum Beispiel durch den mitgelieferten Zeiger zu löschen).

Gibt es eine OOP Art und Weise zu erzwingen, dass der Zeiger von QSharedPointer verwaltet werden, kann nicht gelöscht werden?

Ich denke, man könnte einige seltsame Technik vorstellen, wo das spitze Art ein eigenes destructor und erklären QSharedPointer als Freund haben würde (was effektiv jede ‚außerhalb Löschung‘ verhindern würde kompilieren), aber ich würde wetten, dass nicht etwas Gutes kommen kann aus diesem (und beachten sie, dass es Ihre Art absolut unbrauchbar, es sei denn new'ed machen und zu einem QSharedPointer übertragen).

Gibt es eine OOP Art und Weise zu erzwingen, dass der Zeiger von QSharedPointer verwaltet werden, kann nicht auf einem anderen QSharedPointer weitergegeben werden?

Ich kann nicht von jedem denken, und das ist ein weiterer Grund, warum Sie sollten es vermeiden, den Rohzeiger manipulieren, sobald es auf dem Eigentum an einen QSharedPointer übertragen wurde.

Überprüfen Sie den Code für alle .data () Nutzung und stellen Sie sicher, was sie zurückkehren wird weder gespeichert noch gelöscht. Ich glaube nicht, ein harter Compiler-Fehler wäre gut, denn manchmal ist es in Ordnung ist, die Rohzeiger zu passieren, z.B. auf eine Funktion, die nicht gespeichert werden nicht noch weitergegeben Zeiger löschen. (Vor allem, wenn 3rd-Party-Code verwenden, können Sie nicht immer alles ändern gemeinsamen Zeiger zu verwenden, und oft wollen Sie es an die Arbeit mit beiden, roh und gemeinsame PTR). Man könnte QSharedPointer :: Daten markiert () als veraltet (von Qt Patchen), eine Kompilierung Warnung zu erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top