Shallow copy (yüzeysel kopyalama) – yalnızca nesnenin alanlarının değerlerini, işaretçileri de dahil olmak üzere, kopyalar ancak dinamik olarak ayrılmış belleği çoğaltmaz. Sonuç olarak, her iki nesne de aynı bellek alanına işaret eder. Bu, verilerin değiştirilmesi veya belleğin serbest bırakılması sırasında hatalara neden olabilir.
Deep copy (derin kopyalama) – nesnenin referans verdiği tüm kaynakların tam bir kopyasını oluşturur, böylece her nesne verilerin kendi kopyasına sahip olur.
Ne zaman deep copy gerekir:
Deep copy'nin bir örneği:
class ArrayHolder { public: ArrayHolder(size_t size) : sz(size), data(new int[size]) {} ~ArrayHolder() { delete[] data; } // Derin kopyalama yapıcı ArrayHolder(const ArrayHolder& other) : sz(other.sz), data(new int[other.sz]) { std::copy(other.data, other.data + other.sz, data); } // Derin kopyalama ataması ArrayHolder& operator=(const ArrayHolder& other) { if (this != &other) { delete[] data; sz = other.sz; data = new int[sz]; std::copy(other.data, other.data + sz, data); } return *this; } private: size_t sz; int* data; };
Soru: Kopyalayıcı yapıcıda yalnızca işaretçi değerini kopyalamak düzgün çalışır mı?
Cevap: Hayır, bu iki nesne yok edilirken belleğin çift serbest bırakılmasına yol açar. Kaynakların düzgün yönetimi için derin kopyalama gerçekleştirilmelidir.
Hikaye
Bir projede modüller arasında dizileri taşımak için, kopyalayıcı yapıcısının yalnızca işaretçiyi kopyaladığı sınıf nesneleri kullanıldı (shallow copy). Sonuç olarak, geçici nesne kapsamdan çıktığında dizi yok oldu ve ana nesne "askıda kalan" bir işaretçi ile kaldı, bu da belirsiz davranışa ve uygulamanın çökmesine neden oldu.
Hikaye
Görüntü işleme kütüphanesinde, dinamik olarak ayrılmış tamponlar içeren nesneler sık sık kopyalandı. Deep copy eksikliği nedeniyle bir nesnede bellek serbest bırakıldığında diğeri serbest bırakılan alana erişiyordu. Hem veri bozulmaları hem de nesne silme sırasında çöküşler meydana geliyordu.
Hikaye
Eski kodu modern standartlarla entegre ederken, eski sınıflarda ne kopyalayıcı yapıcı ne de atama operatörü uygulanmıştı. Bu sınıfların standart kütüphane kaplarını kullanması beklenmedik çökmelere yol açıyordu, çünkü kaplar nesneleri yüzeysel olarak kopyalıyordu.