Bu, uzun zamandır beni rahatsız eden bir şey oldu.
Hepimize okulda (en azından ben) tahsis edilen her işaretçiyi serbest bırakmanız GEREKİR. Yine de, hafızayı boşaltmamanın gerçek maliyeti hakkında biraz merak ediyorum. Bazı açık durumlarda, malloc
bir döngü içinde veya bir iş parçacığı yürütmesinin bir parçası olarak çağrıldığında olduğu gibi, serbest bırakmak çok önemlidir, bu nedenle bellek sızıntısı olmaz. Ancak aşağıdaki iki örneği göz önünde bulundurun:
İlk olarak, ben böyle bir şey kodu varsa:
int main()
{
char *a = malloc(1024);
/* Do some arbitrary stuff with 'a' (no alloc functions) */
return 0;
}
Buradaki gerçek sonuç nedir? Benim düşüncem, sürecin öldüğü ve daha sonra yığın alanının yine de gittiğinden, çağrıyı kaçırmanın hiçbir zararı yoktur free
(ancak, kapatma, sürdürülebilirlik ve iyi uygulama için yine de sahip olmanın önemini biliyorum). Bu düşüncede haklı mıyım?
İkinci olarak, biraz kabuk gibi davranan bir programım olduğunu varsayalım. Kullanıcılar gibi değişkenler bildirebilir aaa = 123
ve bunlar daha sonra kullanılmak üzere bazı dinamik veri yapısında saklanır. Açıkçası, bazı * tahsis işlevi (hashmap, bağlantılı liste, bunun gibi bir şey) çağıracak bir çözüm kullanacağınız açıktır. Bu tür bir program için, çağrıldıktan sonra hiçbir zaman özgür olmanız mantıklı değildir malloc
çünkü bu değişkenler programın yürütülmesi sırasında her zaman mevcut olmalıdır ve bunu statik olarak ayrılmış alanla uygulamanın iyi bir yolu yoktur (görebiliyorum). Tahsis edilen ancak yalnızca işlemin sona eren bir parçası olarak boşaltılan bir grup belleğe sahip olmak kötü bir tasarım mıdır? Eğer öyleyse, alternatif nedir?
free(a)
aslında gerçekten boş hafıza için hiçbir şey yapmaz eklemek istiyorum ! Yalnızca, büyük bir mmapped bellek sayfası (genellikle "yığın" olarak adlandırılır) içindeki kullanılabilir bellek parçalarını takip eden malloc'un libc uygulamasındaki bazı işaretçileri sıfırlar. Bu sayfa daha önce değil, yalnızca programınız sona erdiğinde serbest bırakılacaktır.