Sızan bellek programdan çıkıldığında serbest kalıyor mu?


Yanıtlar:


151

Evet, "bellek sızıntısı", bir işlemin artık referansının olmadığı ve bu nedenle artık özgür olamayacağı basit bir bellektir. İşletim sistemi, bir işleme ayrılan tüm belleği hala izler ve bu işlem sona erdiğinde onu serbest bırakır.

Windows, Linux, Solaris, vb. Gibi normal "tatlar" da olduğu gibi, çoğu durumda işletim sistemi belleği boşaltacaktır. Ancak, çeşitli Gerçek Zamanlı İşletim Sistemleri gibi özel ortamlarda program sonlandırıldığında bellek serbest bırakılmayabilir.


4
Soru: İşletim sistemi tüm tahsisleri takip ediyor mu? Ayırdığınız herhangi bir yığın bellek, işlemin sanal bellek alanından gelir - işlem sona erdiğinde, bu alan sisteme toptan geri verilir, değil mi? Tahsisleri yapma süreci, bu sayfalara erişim sağlayan tek süreç olduğundan (kullanıcı bölgesinde) ekstra defter tutmanın neden gerekli olduğunu anlamıyorum. Yoksa yanlış mı öğretildim?
Chris Tonkinson

6
@ Justin: İşletim sistemini bilmeden bunun geçerli olduğunu düşünmüyorum. Belki bahsettiğiniz işletim sistemini açıkça belirtin.
Brian R. Bondy

1
Not: Standart bu konuda hiçbir şey söylemiyor. Ayrıca garanti edilmez. Hepsi olmasa da çoğu modern işletim sistemi üzerinde çalışma şekli budur, ancak buna gerek yoktur ve geçmişte hem yaygın olan hem de bu temizliği yapmayanlar vardı.
Edward Strange

5
Küçük cihazlar ve benzeri için, sızıntılarda kaybolan belleği geri kazanmayan çeşitli gerçek zamanlı işletim sistemleri vardır. Sorunuz, bahsettiğiniz işletim sistemine bağlıdır.
Brian Neal

14
Belirli bellek korumalı işletim sistemlerinde bile "sızıntı" tanımlamanız gerekir. Uygulamaların "sistem" kaynaklarını kendi bellek alanlarının dışına tahsis etmesi çok olasıdır (bunları Windows dünyasında tanımlamak için genellikle tutamaçlar kullanılır). Uygulamanızı kapatmak her zaman bu tür kaynakların serbest bırakılmasını sağlamaz.
David

34

Programınızı çalıştıran işletim sistemi genellikle açıkça serbest bırakılmayan ve açıkça kapatılmayan belleği temizler, ancak bu C ++ standardı tarafından garanti edilmez. Bellek sızıntılarınızı boşaltmayan bazı yerleşik aygıtlar bulabilirsiniz.

Windows ve şimdiye kadar gördüğüm tüm Linux dağıtımlarının bellek sızıntılarını boşalttığı söyleniyor.

Kendiniz test etmek için kolayca büyük bir bellek sızıntısı döngüsü oluşturabilirsiniz. RAM kullanımınızın arttığını izleyin ve ardından programınızı kapatın. RAM kullanımının azaldığını göreceksiniz.


C ++ kullanırken göz önünde bulundurulması gereken bir diğer husus, yığın ayrılmış belleğinizi silmiyorsanız, yıkıcılarınızın da çağrılmamasıdır. Bazen yıkıcılarınız çağrılmazsa başka yan etkilere de sahip olursunuz.


14

Bir masaüstü işletim sistemi (Windows, Linux vb.) Üzerinde mi çalışıyorsunuz? Öyleyse, evet, genel olarak sistem, programdan çıktığında programla ilişkili tüm belleği boşaltacaktır.


10

Genellikle evet. Bazı sistemler, bir program çıktığında otomatik olarak serbest bırakılmayan paylaşılan bellek blokları gibi şeyleri destekler. Birçoğu hala bir referans sayımı tutar ve onu açan tüm programlar çıktığında siler, ancak birkaçı çıkmaz (örneğin, 16 bit Windows, hiçbir şey atıfta bulunmasa bile tahsis edilmiş kalan birkaç öğe türüne sahiptir - gerçi genellikle bir soruna neden olacak kadar birikmeden önce başka nedenlerle çöktü ...)


5

Bildiğim kadarıyla, modern bir işletim sistemi, program sona erdiğinde bu belleği boşaltacaktır.


4

Hangi hafızayı sızdırdığına bağlı. Belleğin bir kısmı işletim sistemi tarafından geri alınamaz. Ancak çoğu işletim sistemindeki çoğu bellek, işlem çıktığında otomatik olarak geri kazanılacaktır.


6
Bazı bellek işletim sistemi tarafından geri alınamaz - örneğin ne?

2
Bazı gerçek zamanlı işletim sistemlerinde, bir işlem çıktığında temizlenmeyen özel Ethernet tampon blokları gördüm.
Brian Neal

1
Paylaşılan hafıza da genellikle geri alınmaz, çünkü geçici işlemlerin kullanması için kalmasını isteyebilirsiniz.
Brian Neal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.