Çöp toplama temelde, yalnızca tahsis edilen nesneler, artık erişilemez olduktan sonra bir noktada otomatik olarak serbest bırakılması anlamına gelir.
Daha doğru bir şekilde, programa erişilemez hale geldiklerinde serbest bırakılırlar , çünkü dairesel referanslı nesneler aksi takdirde asla serbest bırakılmaz.
Akıllı işaretçiler sadece sıradan bir işaretçi gibi davranan herhangi bir yapıya atıfta bulunur, ancak bazı ekstra işlevler de eklenmiştir. Bunlar arasında , tahsisat sayılması ile sınırlı olmamakla birlikte, aynı zamanda yazma-kopyalama, cilt kontrolleri ...
Şimdi, belirttiğiniz gibi, akıllı işaretçiler bir çöp toplama biçimini uygulamak için kullanılabilir .
Ancak düşünce treni şu şekilde gider:
- Çöp toplama işlemi, uygun olduğu için güzel bir şey ve daha az şeyle ilgilenmem gerekiyor
- Bu nedenle: Dilimde çöp toplama istiyorum
- Şimdi GC'yi dilime nasıl sokabilirim?
Tabii ki, baştan böyle tasarlayabilirsiniz. C # çöp toplanacak şekilde tasarlandı , bu nedenle sadece new
nesneniz ve referanslar kapsam dışına çıktığında serbest bırakılacak. Bunun nasıl yapılacağı derleyiciye bağlıdır.
Ancak C ++ 'da çöp toplama amaçlı değildi. Eğer bir işaretçi tahsis edersek int* p = new int;
ve kapsam dışına çıkarsak, p
kendisi yığından çıkarılır, fakat kimse tahsis edilen hafızaya bakmaz.
Şimdi baştan sahip olduğunuz tek şey deterministik yıkıcılar . Bir nesne, yaratıldığı kapsamı terk ettiğinde, yıkıcısı olarak adlandırılır. Şablonlar ve operatörün aşırı yüklenmesi ile birlikte, işaretçi gibi davranan bir sarmalayıcı nesnesi tasarlayabilirsiniz, ancak ona bağlı kaynakları temizlemek için yıkıcı işlevini kullanır (RAII). Buna akıllı işaretçi diyorsun .
Bunların hepsi C ++ 'a özgüdür: Operatör aşırı yüklenmesi, şablonlar, yıkıcılar, ... Bu özel dil durumunda, size istediğiniz GC'yi sağlamak için akıllı işaretçiler geliştirdiniz.
Ancak, GC ile baştan bir dil tasarlarsanız, bu sadece bir uygulama detayıdır. Diyelim ki nesne temizlenecek ve derleyici bunu sizin için yapacak.
C ++ gibi akıllı işaretçiler muhtemelen C # gibi dillerde kesin bir tahribata sahip olmayan dillerde bile mümkün olmaz (C # .Dispose()
belirli nesnelere çağrı yapmak için sözdizimsel şeker sağlayarak çalışır ). Kayıtsız olmayan kaynaklar sonunda GC tarafından geri alınacak, ancak bunun tam olarak ne zaman gerçekleşeceği belirsiz.
Bu da GC'nin çalışmalarını daha verimli yapmasına izin verebilir. Dilin üzerine, üzerine yerleştirilmiş akıllı işaretçilerden daha derine yerleştirilen .NET GC, örneğin bellek işlemlerini geciktirebilir ve daha ucuz hale getirmek için bloklar halinde gerçekleştirebilir veya nesnelerin ne kadar sıklıkla nesnelere bağlı olarak verimliliği arttırmak için hafızayı hareket ettirebileceklerini bile yapabilir. erişilir.