Manuel olarak boş hafıza açmak, dosyaları kapatmak, bu tür şeyler mi demek istiyorsunuz? Öyleyse, özellikle sadece "bellek yönetimi" için değil, "kaynak yönetimi" için de genellersek, kullandığım asgari ve tipik olarak diğer dillerden daha az olduğunu söyleyebilirim. Bu anlamda, aslında C ++ 'ın Java ya da C #' dan daha az manuel kaynak yönetimi gerektirdiğini düşünüyorum.
Bu esas olarak kaynağı yok etmeyi otomatikleştiren yıkıcılar (bellek veya başka bir şey) nedeniyle. Genellikle, bir kaynağı C ++ ile manuel olarak serbest bırakmak / imha etmek zorunda olduğum tek zaman, düşük seviyeli bir veri yapısı (çoğu insanın yapması gerekmeyen bir şey) uyguluyor olsam veya biraz zaman harcadığım bir C API kullanıyorsamdır. manuel olarak serbest bırakılması / tahrip edilmesi / kapatılması gereken C kaynağının bir RAII uyumlu C ++ ambalajına sarılması.
Tabii ki, bir kullanıcı bir görüntü düzenleme yazılımındaki bir görüntüyü kapatmak isterse, görüntüyü bir koleksiyondan veya başka bir şeyden kaldırmam gerekir. Ancak umarım bu bağlamda önemli olan bir türün "bellek" veya "kaynak" yönetimi olarak sayılmaz, çünkü o görüntüyle ilgili belleği serbest bırakmak istiyorsanız, herhangi bir dilde bu çok gerekli. Fakat yine de tek yapmanız gereken, görüntüyü koleksiyondan kaldırmak ve görüntü yıkıcısı gerisini halleder.
Bu arada, örneğin Java veya C # ile karşılaştırırsam, genellikle dosyaları el ile kapatmaları, manüel olarak soketleri çıkarmaları, nesnelerin toplanmasına izin vermek için nesne referanslarını null değerine getirmeleri vb. Bana sorarsanız, bu dillerde kaynak yönetimi. C ++ 'da, genellikle unlock
bir muteks bile gerekmez , çünkü muteks dolabı, muteks kapsam dışında kaldığında sizin için otomatik olarak yapar. Örneğin, C ++ 'ta asla böyle şeyler yapmamalısınız:
System.IO.StreamReader file = new System.IO.StreamReader(path);
try
{
file.ReadBlock(buffer, index, buffer.Length);
}
catch (System.IO.IOException e)
{
...
}
finally
{
if (file != null)
file.Close();
}
C ++ 'da dosyaları elle kapatma gibi şeyler yapmaya gerek yoktur. Sonuç olarak kapsam dışı kaldıklarında mı yoksa normal veya istisnai uygulama yollarında mı, kapsam dışı kaldıklarında kendilerini otomatik olarak kapatırlar. Bellek ile ilgili kaynaklar için benzer bir şey std::vector
. file.Close()
Yukarıdaki gibi bir kod , çoğunlukla, özellikle bir finally
blok bağlamında, C ++ etrafındaki bütün zihniyetin bunu otomatikleştirmesi gerektiğinde, yerel kaynağın manuel olarak serbest bırakılması gerektiğini öne sürdüğü için kaşlarını çattıracaktı .
El ile bellek yönetimi açısından, C'nin en çok, Java / C # a miktarını ve C ++ 'ın bunlardan en azını gerektirdiğini söyleyebilirim. C ++ kullanmak konusunda biraz utangaç olmanın birçok nedeni vardır, çünkü ustalaşması çok zor bir dildir, ancak bellek yönetimi bunlardan biri olmamalıdır. Aksine, aslında bunun bir yönüyle en kolay dillerden biri olduğunu düşünüyorum.
Tabii ki C ++ hafızayı elle ayırmaya ve operator delete/delete[]
elle boş hafızaya çağırmaya başlamanıza izin verir . Aynı zamanda malloc
ve gibi C işlevlerini kullanmanıza izin verir.free
. Fakat bu, Stroustrup, terimi daha erken bir dönem baştan sona koymadan önce, RAII'yi savunan biri olduğundan, insanlar kredi vermeden çok eski hale geldiğini düşündüğüm eski tip kodlama uygulamaları. Bu yüzden "modern C ++" 'nın kaynak yönetimini otomatikleştirdiğini söylemenin adil olacağını sanmıyorum, çünkü bunun amaçtan geldiği sanılıyordu. Aksi takdirde pratikte istisna güvenlik elde edemezsiniz. 90'lı yılların başlarında pek çok yanlış yönlendirilmiş geliştiricinin, C ++ 'ı nesnelerle C gibi kullanmaya çalıştıkları, genellikle istisna işlemeyi tamamen görmezden geldikleri ve asla bu şekilde kullanılmaması gerekiyordu. C ++ 'ı pratikte her zaman kullanılması gerektiği gibi kullanırsanız, bellek yönetimi tamamen otomatiktir ve genellikle el ile uğraşmanız gereken (veya başa çıkmanız gereken) bir şey değildir.