Frage

Wenn ich eine Klasse, die Zeiger als Membervariablen, welche Art von Smart-Pointer enthält, sollte sie haben, wenn ich will nicht wollen Klar Zeiger benutzen? Sie haben nicht geteilt werden müssen (also keine Shared_ptr erforderlich). scoped_ptr wird nicht funktionieren, da ich oft müssen die Objekte außerhalb der Initialisierung Liste erstellen.

Oder ist es vielleicht üblich, eine scoped_ptr bei der Erstellung zu verwenden, wenn etwas noch nicht kann (Ausnahmen geworfen etc.) und danach ordnet sie Klar Zeiger?

War es hilfreich?

Lösung

Wenn Sie nur Mitglied Zeiger in einer Smart-Pointer-Typ-Klasse speichern wollen, so können Sie nicht / nicht vergessen, sie zu löschen, dann eine Standard-Wahl wäre auto_ptr sein. Es ist in der STL und ist leicht „Reset“ mit der reset() Funktion, wenn Sie die aktuellen Speicher zugeordnet freigeben müssen und es mit einem neuen Objekt zu ersetzen.

Sie werden immer noch wollen, um Ihre eigene Kopie Konstruktor und Zuweisungsoperatoren für die Klassen, die Auto_ptr Mitglieder implementieren. Dies ist aufgrund der Tatsache, dass auto_ptrs Zuweisungsoperator überträgt das Eigentum des zugrunde liegenden Objekts so ein Operator Standardzuweisung wird nicht die Wirkung haben, die Sie wollen.

Hier ist, was die Klasse aussehen könnte:

class X
{
public:
    X() :p(new ClassToManage) {}
    X(const X &copy)
        :p(new ClassToManage(*copy.p))
    {
    }

    X &operator=(const X &rhs)
    { 
        this->p.reset(new ClassToManage(*rhs.p));   
    }   

private:
    std::auto_ptr<ClassToManage> p;
};

Für alle anderen Fälle würde ich boost::shared_ptr vorschlagen. Shared_ptr tut Referenzzählung aber Sie können sie in Standardcontainer speichern, die sie sehr nützlich macht.

Sie sollten schließlich versuchen, sich selbst zu befreien, der Verwendung von Normalzeigern für alles, was Punkte an zugewiesenen Speicher zum Löschen verantwortlich es ist. Wenn Sie für den Zugriff auf oder Iterieren über eine einfache alte Array usw. einen einfachen Zeiger zu verwenden, dann ist das in Ordnung (aber fragen Sie sich, warum Sie nicht ein std :: vector verwendet wird), aber wenn man sie zu Punkt auf etwas verwenden, die es ist verantwortlich für die Freigabe dann für Ärger Sie fragen. Mein Ziel beim Schreiben von Code ist keine expliziten Löschungen haben.

Andere Tipps

Sie könnten std::auto_ptr verwenden, die vor dem TR1 vorhanden waren und damit Ihr Code ist nicht abhängig von einem Compiler unterstützt TR1-smartpointers.

verwenden Normalerweise ich eine deep_copy_ptr. Im Augenblick weiß ich von loki smart_ptr und AXTER Smart-Pointer, die dies tun. Es ermöglicht die Pointer-Klasse automatisch etwas wie kopiert werden, wenn es ein normaler Membervariable war (Sie keine spezielle Zuweisungsoperator / Copy-Konstruktor definieren müssen).

Ich glaube, Sie nicht ausdrücklich in der Initialisierungsliste initialisieren müssen (aber wie ein normaler Zeiger, verwenden Sie es nicht, wenn es keinen gültigen Wert hat, natürlich).

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