2008-12-07 25 views
14

Teknik bir sorum var. Bu, doğru kodlama hakkında bir soru DEĞİLDİR.Program Çıkışında Nesne Serbest Bırakılması Gerekiyor mu?

Soruma göre TEKNİK BİR SİTE gerekli çıkış/çıkış programlarında nesneler yayınlıyor mu?

Başka bir deyişle, argüman uğruna diyelim ki, uygulamanızı kapatan bir düğmeniz var, ancak kapatmadan hemen önce bir görüntüyü görüntüledikten sonra uygulamayı kapatırsınız. Uygulamayı kapatmadan önce bu görüntü görünümünü teknik olarak bırakmanız mı gerekiyor? Program çıktığında bellek otomatik olarak serbest bırakılacak mı, yoksa bırakmazsanız bellek bir şekilde "etkin" kalacaktır?

"Serbest bırakmanız" gerektiğini anlıyorum, sorum şu, bunun teknik tarafı ve perde arkasında neler oluyor.

Teşekkür ederiz.

cevap

26

Gerekli değil. Ancak, valgrind veya benzeri bir araç kullanıyorsanız, tüm belleğinizi sarktığınızı yanlış uyarılarla karıştırdığını keşfedeceksiniz.

Nesnelerin Linux tarafında, yığın sbrk sistem çağrısı kullanılarak büyütülür. Bu, genel işlemci bellek alanını bir kerede büyük bir blokla büyütür (bu nedenle birçok sbrk, birçok malloc s için yeterli alan sağlamak için gereklidir). İşlem bittiğinde, çekirdek sbrk tarafından tahsis edilen tüm belleği geri alır. Bu yüzden güvendesin. Çekirdek aynı zamanda bu süreç tarafından açılan tüm dosya tanımlayıcılarını da kapatacaktır.

Ortaya çıkabilecek birkaç sorun var. Süreç hiç bir zaman fork s kapalı bir anda, herhangi bir açık dosya tanıtıcıları çoğaltılacak. Bu tezahürün kendisini, orijinal işlemin ardından kötü olan gizemli bir şekilde asılı bir TCP bağlantısı olarak görmüştüm. Buna ek olarak, süreç kapsamı dışında olan başka kaynaklar da var, bu yüzden süreç öldüğünde geri alınmayacaklar. Bu paylaşılan bellek bölümleri, geçici dosyalar, adlandırılmış yöneltmeler ve UNIX yuvaları ve büyük olasılıkla diğer IPC mekanizmalarını içerir.

Özet olarak? Hafıza iyi. Dosya tanımlayıcıları genellikle iyidir. Temizlenmedikçe daha ezoterik IPC özelliklerinden bazıları korkunç şekilde kırılacaktır.

1

Gerçekten de gerekli değil, ancak kaynağınızın bir kısmını geri dönüştürmek ve başka bir programda kullanmak isterseniz, bellek sızıntıları alabilirsiniz. Yanı sıra, işletim sistemi hiç bir hata olmadan düşünün. Bazı kaynakları serbest bırakmak “unutabilir”.

4

iPhone'da, bilmeniz ve bildiğim kadarıyla yapamazsınız. ApplicationWillTerminate aldıktan sonra: durumunuzu kaydetmek için birkaç saniyeniz var ve işletim sisteminiz işleminizi gerçekleştirir. Örnek uygulamalardan birini oluşturun ve dealloc yöntemlerinden birinde bir kesme noktası koyun. Asla vurulmuyorlar. link text

Not: Objective C dealloc bir C++ Deconstructor aynı şey değildir

İşte bu konuda çok büyük bir argümandır. Bir Deconstructor'da dosyaları, tutamaçları, vb. Kapatabilirsiniz. Objective C'de dealloc sadece bellek bırakmak içindir. Daha önce diğer kaynaklarınızı kapatmalısınız, çünkü dealloc asla aranmayabilir.

0

Serbest bırakmak, hataları bulmanıza yardımcı olabilir. Sık sık dinamik bellek sorunları, serbest kalma zamanında tetiklenir (ör., Geçersiz bir nesneyi serbest bırakmaya çalışırsınız).Her zaman serbest bırakmak, bulunması zor olan hataları tanımlamanıza yardımcı olabilir.

İlgili konular