Wann und wie tiefe Kopien in C ++ zu machen

Klassen, die Ressourcen in ihren Konstruktor zuweisen sollte in der Regel eine Kopie Konstruktor enthalten Kopien dieser Ressourcen zu erstellen. einen neuen Speicherblock und Kopieren der Inhalte des Originals in diesem neuen Block Zuweisung ist als die Schaffung eines bekannten tiefe Kopie (Im Gegensatz zu den Standard flache Kopie im Gegensatz). Verwenden Sie die folgenden Schritte aus, um zu bestimmen, wie und wann tiefe Kopien in C ++ zu machen:

  1. Immer eine tiefe Kopie zu machen, wenn der Konstruktor weist Ressourcen.

    Standardmäßig macht C ++ so genannte "flache" member-by-Mitglied Kopien von Objekten, wenn sie Funktionen oder als Ergebnis einer Zuweisung vorbei. Sie müssen die Standard flache Kopie Betreiber mit ihren tiefen Kopie Äquivalent für jede Klasse ersetzen, die Ressourcen im Konstruktor zuweist. Die häufigste Ressource, die zugeordnet wird ist Heap-Speicher, der durch den neuen Betreiber zurückgegeben wird.

  2. Immer auch einen Destruktor für eine Klasse, die Ressourcen zuweist.

    Wenn Sie einen Konstruktor erstellen, die Ressourcen zuweist, müssen Sie eine destructor erstellen, die sie wieder her. Keine Ausnahmen.

  3. Immer erklären die destructor virtuell.

    Ein gemeinsamer Anfänger Fehler ist, zu vergessen Ihr Destruktor virtuell zu erklären. Das Programm läuft gut, bis einige ahnungslose Programmierer kommt und erbt von der Klasse. Das Programm erscheint nach wie vor zu arbeiten, sondern weil die destructor in der Basisklasse nicht ordnungsgemäß geltend gemacht werden kann, Speicherlecks aus dem Programm wie ein Sieb, bis es schließlich abstürzt. Dieses Problem ist schwer zu finden.

  4. Immer eine Kopie Konstruktor für eine Klasse, die Ressourcen zuweist.

    Der Copy-Konstruktor erstellt eine korrekte Kopie des aktuellen Objekts durch den Speicher aus der Halde Aufteilung und Kopieren des Inhalts des Quellobjekts.

  5. Immer überschreiben den Zuweisungsoperator für eine Klasse, die Ressourcen zuweist.

    Programmierer sollten aus zwingenden Betreiber davon abgehalten werden, aber der Zuweisungsoperator ist eine Ausnahme. Sie sollten den Zuweisungsoperator für jede Klasse überschreiben, die Ressourcen im Konstruktor zuweist.

    Der Zuweisungsoperator sollte drei Dinge tun:

  1. Stellen Sie sicher, dass die linke und rechte Hand Objekt Objekt nicht gleich sind. Mit anderen Worten, sicher sein, dass der Anwendungsprogrammierer nicht schreiben etwas wie (a = a). Wenn sie sind, nichts zu tun.

  2. Rufen Sie den gleichen Code wie der destructor auf der linken Objekt auf seine Ressourcen zurück.

  3. Rufen Sie den gleichen Code wie eine Kopie Konstruktor eine tiefe Kopie der rechten Hand Objekt in die linke Hand Objekt zu machen.

  • Wenn Sie das nicht können, dann löschen Sie den Kopierkonstruktor und den Zuweisungsoperator, so dass das Programm keine Kopien des Objekts zu machen.

  • Wenn Sie nicht selbst tun, weil Ihr Compiler nicht den C ++ 2011 löschen Konstruktor-Funktion nicht unterstützt, eine leere Kopierkonstruktors und Zuweisungsoperator erstellen und erklären ihnen geschützten anderen Klassen zu halten von ihnen.

  • Menü