Bellek Sızıntıları
Sızıntıları bulun ve önleyin
Bellek Sızıntıları, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 3. 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.
Bellek Sızıntısı Nedir
Bellek sızıntısı, öbek belleği ayırdığınız hâlde bunu hiç serbest bırakmadığınız ve belleğe yönelik tek işaretçiyi kaybettiğiniz zaman oluşur.
Bellek, program sonlanana kadar ayrılmış olarak kalır ve kaynakları boşa harcar.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p = malloc(sizeof(int));
*p = 5;
printf("%d\n", *p);
free(p);
return 0;
}İşaretçiyi Kaybetme
Klasik sızıntı, eski ayırmayı serbest bırakmadan önce bir işaretçinin üzerine yeni bir ayırmanın adresini yazmaktır.
İlk blok erişilemez hâle gelir.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p = malloc(sizeof(int));
free(p);
p = malloc(sizeof(int));
*p = 10;
printf("%d\n", *p);
free(p);
return 0;
}Döngülerde Sızıntılar
Her yinelemede serbest bırakmadan bir döngü içinde ayırma yapmak, sızıntıyı hızla büyütür.
Çözüm, işaretçinin sonraki yinelemede üzerine yazılmasından önce belleği serbest bırakmaktır.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
for (int i = 0; i < 3; i++) {
int *p = malloc(sizeof(int));
*p = i;
printf("%d ", *p);
free(p);
}
printf("\n");
return 0;
}Erken Dönüşler Sızıntıya Yol Açar
Ayırmadan sonra yapılan erken bir return, temizleme işleminin atlanmasına neden olabilir. Her çıkış yolunda belleği mutlaka serbest bırakın.
#include <stdio.h>
#include <stdlib.h>
int process(int bad) {
int *p = malloc(sizeof(int));
if (bad) {
free(p);
return -1;
}
*p = 42;
int r = *p;
free(p);
return r;
}
int main(void) {
printf("%d\n", process(0));
return 0;
}goto ile Temizleme Kalıbı
goto ile ulaşılan tek bir temizleme etiketi, her şeyin tek bir yerde serbest bırakılmasını sağlar ve yinelenen free çağrılarını önler.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int rc = 1;
int *p = malloc(sizeof(int));
if (!p) goto done;
*p = 7;
printf("%d\n", *p);
rc = 0;
done:
free(p);
return rc;
}Her Ayırmayı Eşleştirin
En basit kural şudur: her malloc, calloc veya realloc için tam olarak bir karşılık gelen free bulunmalıdır.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *a = malloc(8);
char *b = calloc(4, sizeof(char));
a[0] = 'x';
printf("%c %d\n", a[0], b[0]);
free(a);
free(b);
return 0;
}İç İçe Ayırmaları Serbest Bırakma
Bir yapı öbek belleğine sahipse, dış bloğu serbest bırakmadan önce iç işaretçileri serbest bırakın.
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int *data;
} Box;
int main(void) {
Box *b = malloc(sizeof(Box));
b->data = malloc(3 * sizeof(int));
b->data[0] = 1;
printf("%d\n", b->data[0]);
free(b->data);
free(b);
return 0;
}İşaretçi Dizisini Serbest Bırakma
İşaretçilerden oluşan bir dizi ayırdığınızda ve her giriş kendi ayırması olduğunda, önce her girişi, ardından diziyi serbest bırakın.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n = 3;
int **rows = malloc(n * sizeof(int *));
for (int i = 0; i < n; i++) {
rows[i] = malloc(2 * sizeof(int));
rows[i][0] = i;
}
for (int i = 0; i < n; i++) free(rows[i]);
free(rows);
printf("freed all rows\n");
return 0;
}Sahiplik Disiplini
Her ayırmanın sahibinin kim olduğuna ve onu serbest bırakmaktan kimin sorumlu olduğuna karar verin. Çağıranların döndürülen bir işaretçiyi serbest bırakıp bırakmayacağını bilmeleri için bunu belgeleyin.
#include <stdio.h>
#include <stdlib.h>
char *make_greeting(void) {
char *s = malloc(6);
s[0]='h'; s[1]='i'; s[2]='\0';
return s;
}
int main(void) {
char *g = make_greeting();
printf("%s\n", g);
free(g);
return 0;
}Sızıntıları Bulan Araçlar
Valgrind ve AddressSanitizer gibi araçlar her ayırmayı izleyerek ve hiç serbest bırakılmayanları göstererek sızıntıları bildirir.
Gerçek programları doğrulamak için bu araçlar vazgeçilmezdir.
Temiz Bir Ayırma Yaşam Döngüsü
Hepsini bir araya getirirsek: ayırın, denetleyin, kullanın, her yolda serbest bırakın ve işaretçiyi NULL yapın. Bu, programların sızıntısız kalmasını sağlar.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p = malloc(4 * sizeof(int));
if (!p) return 1;
for (int i = 0; i < 4; i++) p[i] = i + 1;
int sum = 0;
for (int i = 0; i < 4; i++) sum += p[i];
printf("sum = %d\n", sum);
free(p);
p = NULL;
return 0;
}Hızlı Kontrol
Bellek sızıntıları konusundaki anlayışınızı sınayın.
Özet
Bellek sızıntılarını önlemeyi öğrendiniz:
- Her ayırmayı tam olarak bir
freeçağrısıyla eşleştirin. - Erken dönüşler ve hatalar da dâhil olmak üzere her çıkış yolunda belleği serbest bırakın.
- İç içe ayırmaları ve işaretçi dizilerinin ayırmalarını önce içtekiler olmak üzere serbest bırakın.
- Açık bir sahiplik tanımlayın ve doğrulamak için Valgrind gibi araçlar kullanın.
Sıkça Sorulan Sorular
“Bellek Sızıntıları” dersi ücretsiz mi?
Evet — “Bellek Sızıntıları” 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.
“Bellek Sızıntıları” dersinde ne öğreneceğim?
Sızıntıları bulun ve önleyin 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 3. dersidir.
“Bellek Sızıntıları” 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
- malloc ve free
- calloc ve realloc
- Bellek Sızıntıları
- Sarkan İşaretçiler