Frage

Ich habe einen Zeiger auf eine QScriptEngine, dass ich durch die überladene Konstruktor der Klasse der Klasse Evaluator vorbei und weist sie QScriptEngine *engine_ (Klasse Property Subklassen Evaluator, und nennt diesen Konstruktor Evaluator es einen bereits zugewiesenen QScriptEngine vorbei). Der Konstruktor ohne Argumente erstellt die neuen QScriptEngine Zeiger (Klasse Generic Subklassen auf diese Weise Evaluator). Im destructor teste ich, ob engine_ nicht NULL ist, löschen Sie den Zeiger, dann weisen Sie NULL. Sollte der Zeiger (engine_) in der abgeleiteten Property jetzt auch NULL werden? Etwas sagt mir, das ist nicht der Fall. Wenn nicht, wie Sie mit dieser Situation umgehen? Ich brauche die QScriptEngine ganzen dieselbe Instanz zu sein. QScriptEngine des Operator = ist privat, oder ich würde die Zeiger alle zusammen zu vermeiden.

sah ich einige Informationen über freigegebene Zeiger (boost::shared_ptr und std:tr1::shared_ptr) in einer anderen SO Frage. Ich verwende bereits Schub für die regex-Bibliothek, so Boost ist nicht aus der Frage, ob dies der beste Weg ist, um damit umzugehen. Hoffentlich gibt es einen nicht-Boost-Weg, für die allgemeinen C ++ Kenntnisse und zukünftigen Projekte.

War es hilfreich?

Lösung

Sie können dieses Problem lösen, indem eine der Klassen (Klasse A) Kontrolle der Lebensdauer des Zeigers, zusammen mit einer ‚Getter‘ Methode zu geben. Die andere Klasse (Klasse B) nennen würde immer eine der Getter, wenn es um den Zeiger benötigt. Auf diese Weise bleibt ein in der Steuerung des Zeigers zu allen Zeiten. Nachteil ist die Getter-Funktion (es wahrscheinlich inline wird, aber es ist noch eine zweite Indirektion). Auch B ist zu haben, dass die Zeiger auf NULL auf so ziemlich jedem Gebrauch zu überprüfen.

Ihre andere Wahl ist, den Zeiger in so etwas wie boost :: shared_ptr wickeln, die das Problem der Pflege nimmt (wenn sie richtig verwendet wird) durch die zugrunde liegende Zeiger halten und Löschen es nur dann, wenn alle Objekte, die diesen Zeiger teilen gelöscht. Sie können dies selbst schreiben, aber da Sie bereits Schub im Spiel haben, würde ich nur deren Umsetzung verwenden.

Eine dritte Wahl ist wieder Faktor der ganze Sache, so dass Sie nicht über einen gemeinsamen Zeiger benötigen. Ich würde persönlich nie ein C ++ Design-Programm, das Zeiger geteilt benötigt wird, nur weil es ein Ort, an dem die Speicherverwaltung Fehler leicht über die Jahre einschleichen könnten, aber das ist nur meine Meinung.

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