logo

C'de çöp toplama

Bilgisayar dillerinde, çöp toplama Bellek yönetiminin önemli bir bileşenidir. Bir programın belleğinin otomatik olarak tanımlanıp serbest bırakılması işlemidir. C programlama, yerleşik çöp toplama yeteneklerinden yoksundur çünkü düşük seviye Programlama dili. Ancak C programları için çöp toplama özellikleri sunan çok sayıda kütüphane vardır. Bu yazımızda C'de çöp toplamanın nasıl uygulandığını inceleyeceğiz. Boehm-Demers-Weiser çöp toplayıcı kütüphanesi.

C, düşük seviyeli bellek yönetimi mekanizmaları sunar. malloc() Ve ücretsiz() işlevleri . ücretsiz() yöntemi Artık gerekmediğinde belleği serbest bırakmak için kullanılırken, malloc() işlevi çalışma zamanı sırasında belleği dinamik olarak tahsis etmek için kullanılır. Bu işlevlerin temel sözdizimi aşağıdaki gibidir:

 void* malloc(size_t size); void free(void* ptr); 

Tahsis edilen belleğin başlangıcını gösteren bir işaretçi, malloc() tahsis edilecek bayt sayısını belirten bir argüman karşılığında işlev görür. Daha önce tahsis edilen hafıza malloc() yöntemi tarafından serbest bırakılır ücretsiz() işlevi , ek tahsisler için erişilebilir hale getirir.

C'nin bellek yönetim sistemi çok fazla esnekliğe izin verirken, aynı zamanda bellek yönetimi yükünü de programcıya yükler. Bellek sızıntıları, bellek tahsis edildiğinde ancak hiçbir zaman serbest bırakılmadığında bellek yönetimi rutinlerinin yanlış kullanımından veya belleğe serbest bırakıldıktan sonra erişildiği bölümleme hatalarından kaynaklanabilir.

Bir bellek yönetimi tekniği olarak adlandırılan çöp toplama Artık bir program tarafından kullanılmayan belleği otomatik olarak tanımlar ve serbest bırakır. Çöp toplama programcının belleği manuel olarak yönetmesine gerek kalmaz, bu da bellek sızıntısı ve bölümleme hataları riskini azaltır.

C programı için, Boehm-Demers-Weiser çöp toplayıcı kütüphanesi teklifleri çöp toplama Yetenekler. Bellek, kitaplığın işlev koleksiyonu kullanılarak tahsis edilebilir; bu işlevler artık kullanılmayan belleğin otomatik olarak tanımlanması ve serbest bırakılması için de kullanılabilir. Kütüphane istihdam ediyor işaretle ve süpür Hafızayı bulma ve serbest bırakma tekniği.

Sözdizimi:

Temel sözdizimi Boehm-Demers-Weiser çöp toplayıcı kütüphane fonksiyonları aşağıdaki gibidir:

 #include void* GC_malloc(size_t size); void* GC_calloc(size_tnmemb, size_t size); void* GC_realloc(void* ptr, size_t size); void GC_free(void* ptr); 

Bu sözdiziminde, GC_calloc() işlevi belleği ayırmak ve başlatmak için kullanılır sıfır , oysa GC_malloc() işlevi Belleği dinamik olarak ayırır. Benzer realloc() yöntemi C'de, GC_realloc() işlevi belleği yeniden atamak için kullanılır. Hafızanın serbest bırakılması şu şekilde gerçekleştirilir: GC_free() yöntemi .

Bir resme bir göz atalım Boehm-Demers-Weiser çöp toplayıcı kütüphanesi iş başında. Aşağıdaki program şunu kullanır: GC_malloc() işlevi tam sayıların bağlantılı bir listesini oluştururken her düğüm için bellek ayırmak. Bundan sonra bağlantılı listenin değerleri yazdırılır ve program sonlandırılır.

 #include #include typedef struct node { int value; struct node* next; } node; int main() { GC_INIT(); node* head = GC_malloc(sizeof(node)); node* current = head; for (int i = 1; ivalue = i; current->next = GC_malloc(sizeof(node)); current = current->next; } current->next = NULL; current = head; while (current != NULL) { printf('%d
', current->value); current = current->next; } return 0; } 

Çıktı:

Program çalıştırıldığında aşağıdaki çıktı üretilir:

 1 2 3 4 5 6 7 8 9 10 

Açıklama:

tohumlar vs sporlar

Bu örnekte ilk olarak şunu kullanıyoruz: GC_INIT() çöp toplayıcıyı başlatma işlevi. Bundan sonra, bağlantılı listenin baş düğümü kullanılarak oluşturulur. GC_malloc() yöntemi ve geçerli işaretçi onu işaret edecek şekilde değiştirilir. Bir sonraki adım, bağlantılı listeye daha fazla düğüm eklemek için bir döngü kullanmak ve her düğümün değerini döngü sayacına atamaktır. değişken i ve listede kendisinden sonraki düğümün bir sonraki işaretçisi. Listenin sonunu bildirmek için son olarak listedeki son düğümün bir sonraki işaretçisini şu şekilde ayarladık: HÜKÜMSÜZ .

Bir kullanarak döngü sırasında listeye göz atmak ve her düğümün değerini yazdırmak için, ardından değerleri bağlantılı listede yazdırırız. Sonunda biz 0'a dön Programın başarıyla çalıştığını göstermek için.

Çözüm

Bu blog yazımızda şunlara baktık: Boehm-Demers-Weiser çöp toplayıcı kütüphanesinin C dilinde çöp toplama uygulaması. Çöp toplayıcı kütüphane fonksiyonlarının temel söz dizimini inceledik ve bunların basit bir örnek programda nasıl kullanılacağını gösterdik. Örnek programın çıktılarından ve öneminden de bahsettik.

Etraflı, çöp toplama C programcılarına daha iyi ve daha etkili bellek yönetimi konusunda yardımcı olabilecek çok önemli bir yaklaşımdır. C programcıları, düşük seviyeli bir dil kullanırken çöp toplamadan yararlanabilirler. Boehm-Demers-Weiser çöp toplayıcı paketi.