Belleği Serbest Bırakma ve Sızıntıları Önleme
Temizliği doğru yapın.
Belleği Serbest Bırakma ve Sızıntıları Önleme, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.
Her malloc için bir free Gerekir
Yığın belleği, onu free ile serbest bırakana kadar ayrılmış kalır. Bir bloğa ait tek göstericiyi serbest bırakmadan kaybederseniz bu bellek sızar.
Sızıntılar zamanla birikir ve uzun süre çalışan programlarda belleği tüketebilir.
int *a = malloc(100 * sizeof(*a));
/* ... use a ... */
free(a);free Gerçekte Ne Yapar
free(p), bloğu yeniden kullanılabilmesi için bellek ayırıcıya geri verir. p değerini değiştirmez.
free işleminden sonra p hâlâ artık geçersiz olan eski adresi gösterir. Bu adrese erişmek tanımsız davranıştır.
free(p);
/* p is now a dangling pointer */Sarkan Gösterici Tuzağı
Bir göstericiyi serbest bıraktıktan sonra kullanmak, serbest bırakılmış belleği kullanma hatasıdır. İlk bakışta çalışıyor gibi görünebilir; ardından verileri bozabilir veya öngörülemez biçimde çökebilir.
Basit bir önlem, göstericiyi serbest bıraktıktan hemen sonra NULL olarak ayarlamaktır.
free(a);
a = NULL; /* now misuse is a clean NULL deref, easier to catch */Çift free Tanımsızdır
Aynı blok üzerinde free işlevini iki kez çağırmak, bellek ayırıcının iç durumunu bozar ve çoğu zaman çökmeye neden olur.
İlk free işleminden sonra göstericiyi NULL olarak ayarlamak yardımcı olur; çünkü free(NULL) açıkça güvenlidir ve hiçbir şey yapmaz.
free(a);
a = NULL;
free(a); /* free(NULL) is a harmless no-op */Yalnızca malloc ile Ayırdıklarınızı Serbest Bırakın
free işlevine yalnızca malloc, calloc veya realloc tarafından döndürülen bir gösterici verin.
Bir yığın değişkeninin adresini, bir dize sabitini veya bir bloğun ortasını gösteren bir göstericiyi serbest bırakmak tanımsız davranıştır.
int x = 5;
/* free(&x); WRONG: x is on the stack */
int *p = malloc(sizeof(int));
free(p); /* correct */Erken Dönüşten Kaynaklanan Sızıntı
Yaygın bir sızıntı senaryosu şudur: bellek ayırırsınız, ardından serbest bırakmadan dönen bir hata yoluna girersiniz. Böylece blok kaybolur.
Belleğin sahibi olan her çıkış yolunun önce belleği serbest bıraktığından emin olun.
int *a = malloc(n * sizeof(*a));
if (something_failed) {
free(a); /* don't forget this before returning */
return -1;
}Temiz Bir Ayırma ve Serbest Bırakma Programı
Bu program her yolda belleği ayırır, kullanır ve serbest bırakır; hiçbir sızıntı bırakmaz.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n = 4;
int *a = malloc(n * sizeof(*a));
if (!a) return 1;
for (int i = 0; i < n; i++) a[i] = i + 1;
int sum = 0;
for (int i = 0; i < n; i++) sum += a[i];
printf("%d\n", sum);
free(a);
a = NULL;
return 0;
}İç İçe Ayırmaları Serbest Bırakma
Bir blok başka bloklara göstericiler içeriyorsa önce iç blokları, ardından dış bloğu serbest bırakın.
Dış bloğu önce serbest bırakmak, iç blokların adreslerini kaybetmenize ve bu blokların sızmasına yol açar.
for (size_t i = 0; i < rows; i++)
free(grid[i]); /* free each row first */
free(grid); /* then the array of pointers */Her Blok İçin Tek Sahip
Her bellek ayırmasının sahibi olan ve onu serbest bırakmaktan sorumlu kod bölümünü belirleyin.
İki gösterici aynı bloğu gösteriyor ve ikisi de bloğu serbest bırakıyorsa çift free oluşur. Açık sahiplik bunu önler.
Araçlarla Sızıntıları Belirleme
Sızıntıları gözle bulmak zorunda değilsiniz. valgrind veya AddressSanitizer gibi araçlar, sızıntıları ve geçersiz free çağrılarını satır numaralarıyla bildirir.
-g ile derleyip aracı kullanarak çalıştırın; böylece tam olarak neyin serbest bırakılmadığını görebilirsiniz.
/* gcc -g -fsanitize=address prog.c && ./a.out */
/* or: valgrind --leak-check=full ./a.out */Kurulum Sırasının Tersine Göre Serbest Bırakma
Güvenilir bir alışkanlık şudur: birden çok kaynak edinen işlevde kaynakları edinme sırasının tersine göre serbest bırakın.
Bu yöntem bağımlılıkların oluşturulma biçimini yansıtır ve temizleme işlemini öngörülebilir tutar.
char *buf = malloc(64);
int *idx = malloc(64 * sizeof(int));
/* ... use them ... */
free(idx); /* free last-acquired first */
free(buf);Hızlı Kontrol
Belleği serbest bırakma konusundaki anlayışınızı sınayın.
Özet
Her bellek ayırmayı, her kod yolunda tam olarak bir free çağrısıyla eşleştirin.
Serbest bıraktıktan sonra göstericileri NULL olarak ayarlayarak sarkan göstericilerden ve çift free çağrılarından kaçının. İç içe ayırmaları önce içtekileri serbest bırakacak şekilde yönetin, her bloğa tek bir sahip verin ve sızıntıları yakalamak için valgrind veya ASan kullanın. Artık dinamik diziler için eksiksiz araç takımına sahipsiniz.
Sıkça Sorulan Sorular
“Belleği Serbest Bırakma ve Sızıntıları Önleme” dersi ücretsiz mi?
Evet — “Belleği Serbest Bırakma ve Sızıntıları Önleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.
“Belleği Serbest Bırakma ve Sızıntıları Önleme” dersinde ne öğreneceğim?
Temizliği doğru yapın. C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Belleği Serbest Bırakma ve Sızıntıları Önleme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Dizi Ayırma
- realloc ile Büyütme
- Yeniden Kullanılabilir Vektör Türü
- Belleği Serbest Bırakma ve Sızıntıları Önleme