Frage

Bitte schreiben Sie eine Liste von Aufgaben, die eine Kopie Konstruktor und Zuweisungsoperator müssen in C ++ tun Ausnahme Sicherheit zu halten, Speicherlecks usw. vermeiden

War es hilfreich?

Lösung

Zuerst sicher, dass Sie wirklich Kopie unterstützen müssen. Die meiste Zeit ist es nicht der Fall ist, und somit zu deaktivieren beide sind der Weg zu gehen.

Manchmal werden Sie noch brauchen, Vervielfältigung auf einer Klasse von einer polymorphen Hierarchie zu schaffen, in diesem Fall: den Zuweisungsoperator deaktivieren, schreiben Sie ein (geschützt?) Konstruktor kopieren und eine virtueller Klon () Funktion zur Verfügung stellen.

Ansonsten im Fall, dass Sie einen Wert Klasse schreiben, sind Sie zurück in das Land der Orthogonal kanonischen Form von Coplien. Wenn Sie ein Mitglied haben, das nicht trivial kopiert werden können, müssen Sie eine Kopie-Konstruktor zur Verfügung zu stellen, eine destructor, eine Zuordnung-Operator und einen Standardkonstruktor. Diese Regel kann verfeinert werden, zum Beispiel unter: das Recht der Big Two

Ich würde auch einen Blick haben unter C ++ FAQ zur Zuordnung Betreiber empfehlen , und im copy-and-Swap-Idiom und unter GOTW .

Andere Tipps

Der Compiler erzeugt Versionen funktionieren in den meisten Situationen.

Sie müssen ein bisschen schwieriger, über das Problem denken, wenn Ihr Objekt einen RAW-Zeiger enthält (ein Argument für nicht RAW Zeiger). So haben Sie einen RAW-Zeiger, ist die zweite Frage besitzen Sie den Zeiger (wird von Ihnen gelöscht werden)? Wenn ja, dann müssen Sie die Regel von 4 anzuwenden.

Owning mehr als 1 RAW Zeiger zunehmend schwierig wird, richtig zu tun (Die Zunahme der Komplexität ist auch nicht linear [aber das ist Beobachtungs- und ich habe keine wirklichen Statistiken diese Aussage zu untermauern]). Also, wenn Sie mehr als 1 RAW Zeiger darüber nachdenken, jeder in seiner eigenen Klasse (eine Form von Smart-Pointer) gewickelt wird.

Regel 4: Wenn ein Objekt der Besitzer eines RAW-Zeiger ist, dann müssen Sie die folgenden 4 Mitglieder definieren, um sicherzustellen, dass Sie die Speicherverwaltung korrekt verarbeiten:

  • Constructor
  • Kopieren Constructor
  • Zuordnung Operator
  • Destructor

Wie Sie definieren diese werden von den Situationen ab. Aber die Dinge zu achten:

  • Standard Konstruktion: Zeiger auf NULL
  • Kopieren Constructor: Verwenden Sie das Kopieren und Tauschen Ideum auf "Strong Exception-Garantie" zur Verfügung zu stellen
  • Zuweisungsoperator: Suchen Sie nach Zuweisung an sich selbst
  • Destructor: Schutz gegen Ausnahmen aus dem destructor ausbreitende
  • .

versuchen, dies zu lesen.

http://www.icu-project.org/docs /papers/cpp_report/the_anatomy_of_the_assignment_operator.html

ist eine sehr gute Analyse des Zuweisungsoperators

Ich habe keine Ahnung von Ausnahme sicher hier, aber ich gehe auf diese Weise. Stellen wir uns vor, es ist ein Templat-Array-Wrapper. Hoffe, es hilft:)

Array(const Array& rhs)
    {
        mData = NULL;
        mSize = rhs.size();
        *this = rhs;
    }

    Array& operator=(const Array& rhs)
    {
        if(this == &rhs)
        {
            return *this;
        }

        int len = rhs.size();

        delete[] mData;

        mData = new T[len];

        for(int i = 0; i < len; ++i)
        {
            mData[i] = rhs[i];
        }

        mSize = len;

        return *this;
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top