Bellek Yönetimi: Çerçeve Ayırma
Çerçevedeki ayırma, bir işlev çağrıldığında ayarlanan "yığın çerçevesinden" adını alır. Yığın çerçevesi, işlevin bağımsız değişkenlerini ve işlev için yerel olarak tanımlanan değişkenleri geçici olarak tutan bir bellek alanıdır. Derleyici bu değişkenler için alanı otomatik olarak ayırdığından çerçeve değişkenlerine genellikle "otomatik" değişkenler adı verilir.
Çerçeve ayırmalarının iki temel özelliği vardır. İlk olarak, bir yerel değişken tanımladığınızda, yığın çerçevesinde büyük bir dizi veya veri yapısı olsa bile değişkenin tamamını tutmak için yeterli alan ayrılır. İkincisi, çerçeve değişkenleri kapsam dışına çıktığında otomatik olarak silinir:
void MyFunction()
{
// Local object created on the stack
CString strName;
// Object goes out of scope and is deleted as function ends
}
Yerel işlev değişkenleri için bu kapsam geçişi işlevden çıkıldığında gerçekleşir, ancak iç içe küme ayraçları kullanıldığında çerçeve değişkeninin kapsamı işlevden daha küçük olabilir. Çerçeve değişkenlerinin otomatik olarak silinmesi çok önemlidir. Basit ilkel türler (veya bayt gibiint
), diziler veya veri yapıları söz konusu olduğunda, otomatik silme işlemi değişkeni tarafından kullanılan belleği geri alır. Değişken kapsamın dışına çıktığı için yine de erişilemez. Ancak C++ nesneleri söz konusu olduğunda, otomatik silme işlemi biraz daha karmaşıktır.
Bir nesne çerçeve değişkeni olarak tanımlandığında, oluşturucu tanımın karşılandığı noktada otomatik olarak çağrılır. Nesne kapsam dışına çıktığında, nesnenin belleği geri kazanılmadan önce yok edicisi otomatik olarak çağrılır. Bu otomatik yapı ve yıkım çok kullanışlı olabilir, ancak özellikle yıkıcıya yapılan otomatik çağrıların farkında olmanız gerekir.
Nesneleri çerçeveye ayırmanın temel avantajı, nesnelerin otomatik olarak silinmesidir. Nesnelerinizi çerçeveye ayırdığınızda bellek sızıntılarına neden olan unutulan nesneler konusunda endişelenmeniz gerekmez. (Bellek sızıntılarıyla ilgili ayrıntılar için makaleye bakınMFC'de Bellek Sızıntılarını Algılama.) Çerçeve ayırmanın dezavantajı, çerçeve değişkenlerinin kapsamları dışında kullanılamamalarından kaynaklanır. Yığın ayırma yerine çerçeve ayırmayı seçmenin bir diğer faktörü, büyük yapılar ve nesneler için yığın alanı genellikle sınırlı olduğundan depolama için yığın yerine yığının kullanılması daha iyi olmasıdır.