Bilmeden bir bellek sızıntısı programladıysam ve uygulama sona ererse, sızan bellek serbest kalır mı?
Bilmeden bir bellek sızıntısı programladıysam ve uygulama sona ererse, sızan bellek serbest kalır mı?
Yanıtlar:
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.
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.
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ü ...)
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.