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.
{
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):
{
a = new int[c.n];
n = c.n;
for (int i=0; i<n; i++)
a[i] = c.a[i]; // deep copy
}