C-Programmierung

Deep Copy

Copy-Konstruktor | | Ãœberladen von Operatoren

Der Standard-Copy-Konstructor kopiert komponentweise.

Dies macht Sinn, außer bei Referenzen.

Sei C eine Klasse und erzeuge im Konstruktor eine Referenz auf einen externen Speicherbereich, der im Destruktor wieder freigegeben wird (siehe Matrix als Beispiel).
Dann führt eine Zuweisung von einem Objekt auf das andere Objekt zu einer Kopie der Referenz und nicht zu einer Kopie des referenzierten Speicherbereichs.

class C
{
   public:

   C(int n = 10)
   {
      a=new int[n];
      C::n = n;
   }

   ~C()
   {
      delete[] a;
   }

   int n;
   int *a;
};

{
   C a;
   C b(a);
} // crash caused by double free

In diesem Fall würde b denselben Speicherbereich referenzieren wie a.
Nach dem Ende der Lebenszeit von a und b würde zweimal derselbe Speicherbereich freigegeben werden (double free).

Daher muss der Copy-Construktor explizit überschrieben werden, um die referenzierten Objekte explizit zu kopieren (deep copy):

C(const C &c) // copy constructor
{
   a = new int[c.n];
   n = c.n;

   for (int i=0; i<n; i++)
      a[i] = c.a[i]; // deep copy
}


Copy-Konstruktor | | Ãœberladen von Operatoren

Options: