Hm also ich habe deine Version grade mal getestet, du machst ja auch nix anders, wenn ich jetzt eine klasse habe, die wiederum selbst wieder Pointer auf andere Klassen enthält, machst du nix anderes als die Speicheraddressen zu Kopieren, aber nicht deren Inhalt.
|
Quellcode
|
1
2
|
for(unsigned int c = 0; c < m_uiSize; ++c)
m_pArray[c] = pData[c];
|
Um eine tiefe Kopie zu erzeugen musst du die in der klasse selbst enthaltende Objekte auch kopieren, du referenzirst nur, und wenn du den ursprünglichen Container löscht zeigen die Referenzen ins leere. Kannst du ja gerne mal ausprobieren. Für deine Methode müssen die Klassen eine Copy Methode enthalten, die Jedes Objekt Kopiert, und das ist sau langsam, weil du rekursiv in die tiefe gehen musst, bis du die letzte klasse erreicht hast. Teste es mal, erstell eine CArray, das Komplexe Klassen enthält, die wiederum Pointer auf viele andere besitzen. Kopiere das Array, und lösche das erste. Die destruktoren der Klassen werden aufgerufen, und die Pointer werden gelöscht, jetzt sind alle Elemente in der Kopie der ersten CArray Valid, da die Pointer der Klassen ins leere zeigen. Zum testen habe ich einfache Smart_ptr’s die auf den stack erzeugt wurden benutzt. Klar funktioniert das ganze, wenn die Objekte irgendwo außerhalb erzeugt wurden, aber das kann ja nicht der sinn sein? Es gibt nur den weg über das reference counting um solche Probleme zu lösen.
Um das ganze mal zu veranschaulichen.
Smart_ptr (Enthält) RealPtr, RealPtr enthält Komplexes Objekt, Array wird Kopiert, dass erste Array wird gelöscht, Destrucktor der Smart_ptr’s löschen die Objekte, alle Kopierten Smart_ptr’s zeigen ins leere.
Oder willst du mir verbieten Objekte direkt in der AddMethode zu erzeugen? Dafür würde dich jeder C++ Coder totschlagen. Du kannst das Problem nur lösen, indem du ein Träger verwendest, der in dem Array eingebunden wird, der die Daten enthält und auch einen reference counting vornimmt, und erst dann sich löscht wenn der ref count bei 0 ist.
mfg
Maverick