0Pricing
C Academy · Ders

Sızıntıları Algılama

memcheck temelleri

Sızıntıları Algılama, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 2. 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.

Sızıntı Nedir

Bir bellek sızıntısı, malloc, calloc veya realloc ile heap belleği ayırdığınız ve free çağırmadan önce ona işaret eden tüm göstericileri kaybettiğiniz zaman oluşur.

Blok ayrılmış durumda kalır; ancak süreç sonlanana kadar erişilemez. Uzun süre çalışan programlarda sızıntılar birikerek bellek tükenene kadar devam eder.

En Basit Sızıntı

Bu program 40 baytlık tek bir blokta sızıntı oluşturur.

p göstericisi yerel bir değişkendir. main döndüğünde p kaybolur; ancak işaret ettiği heap bloğu hiçbir zaman serbest bırakılmaz.

#include <stdlib.h>

int main(void) {
    int *p = malloc(10 * sizeof(int));
    p[0] = 1;
    return 0; /* never free(p) */
}

memcheck'i Çalıştırma

memcheck varsayılan araçtır; bu nedenle araç adını yazmadan da kullanabilirsiniz.

Her sızan bellek ayırma işlemi için yığın izi almak üzere --leak-check=full ekleyin.

gcc -g -O0 -o leak leak.c
valgrind --leak-check=full ./leak

Sızıntı Özeti

Valgrind çıkışta bir LEAK SUMMARY yazdırır. Yukarıdaki program için çıktı yaklaşık olarak şöyledir:

definitely lost: 40 bytes in 1 blocks

İz, tam malloc çağrı konumunu gösterir; böylece hangi bellek ayırma işleminin serbest bırakılmadığını kesin olarak bilirsiniz.

Dört Sızıntı Kategorisi

memcheck kaybedilen belleği dört gruba ayırır:

  • definitely lost — geride hiçbir gösterici kalmamıştır; gerçek bir sızıntıdır
  • indirectly lost — yalnızca definitely-lost bir blok üzerinden erişilebilirdir
  • possibly lost — yalnızca bloğun içini gösteren bir gösterici kalmıştır
  • still reachable — çıkışta bir gösterici vardır; ancak belleği hiç serbest bırakmamışsınızdır

Definitely Lost ve Still Reachable Karşılaştırması

definitely lost acil müdahale gerektiren kategoridir: program çalışırken bu baytlar hiçbir zaman geri kazanılamaz.

still reachable daha hafif bir durumdur. Blok çıkışta sızmış olsa da genel veya statik bir gösterici hâlâ ona başvurur; bu nedenle genellikle yalnızca bir kez yapılan ve serbest bırakmayı unuttuğunuz bir bellek ayırma işlemidir.

Dolaylı Sızıntılar

Bağlı bir yapının başını kaybettiğinizde her düğüm erişilemez hâle gelir.

Baş definitely lost, geri kalan düğümler ise indirectly lost olarak görünür. Kök nedeni, yani kaybolan başı düzeltmek hepsini geri kazandırır.

struct Node { int v; struct Node *next; };

struct Node *make(void) {
    struct Node *h = malloc(sizeof *h);
    h->next = malloc(sizeof *h);
    h->next->next = NULL;
    return h;
}
/* if the caller drops the returned head, both nodes leak */

Düzeltilmiş Sürüm

Ayırdığınız belleği serbest bırakın. Bu sürüm hiçbir sızıntı oluşturmaz.

Valgrind altında şu raporu verir: All heap blocks were freed -- no leaks are possible.

#include <stdlib.h>

int main(void) {
    int *p = malloc(10 * sizeof(int));
    p[0] = 1;
    free(p);
    return 0;
}

Bellek Ayırma İşlemlerini Sayma

Sızıntı olmasa bile HEAP SUMMARY programınızın ne kadar bellek işlemi yaptığını gösterir:

total heap usage: 1 allocs, 1 frees, 40 bytes allocated

Bellek ayırma ve serbest bırakma sayıları eşleştiğinde temiz bir çalıştırma elde edersiniz. Uyumsuzluk, bir şeylerin kaçmış olabileceğine dair ilk ipucunuzdur.

Erişilebilir Blokları Gösterme

Varsayılan olarak memcheck still reachable bloklarını ayrıntılı biçimde listelemez. Bunları da denetlemek için şunu ekleyin:

--show-leak-kinds=all

Bu seçenek her kategori için bir iz oluşturur; çıkıştan önce kesinlikle her şeyi serbest bırakan bir program istediğinizde kullanışlıdır.

valgrind --leak-check=full --show-leak-kinds=all ./leak

Hata Yollarındaki Sızıntılar

En sinsi sızıntılar erken dönüş yollarında gizlenir. Burada, ikinci bellek ayırma işlemi başarısız olursa ilk blokta sızıntı oluşur.

Sıradan testler bu dallara nadiren ulaşır; ancak memcheck, yol her çalıştırıldığında bunları yakalar. Hata durumunda dönmeden önce elinizde tuttuğunuz her şeyi daima serbest bırakın.

char *a = malloc(100);
char *b = malloc(100);
if (!b) {
    /* bug: a is leaked here */
    return -1;
}
/* fix: free(a); before returning */

Hızlı Kontrol

En acil ilgilenilmesi gereken sızıntı kategorisini seçin.

Özet

Artık memcheck ile sızıntıları tespit edebilirsiniz:

  • -g ile derlenmiş bir ikili dosyada valgrind --leak-check=full ./prog komutunu çalıştırın
  • LEAK SUMMARY ve HEAP SUMMARY bölümlerini okuyun
  • Önce definitely lost kayıtlarına öncelik verin, ardından dolaylı sızıntıları kök nedenlerine kadar izleyin
  • Erişilebilir blokları denetlemek için --show-leak-kinds=all kullanın

Sırada: geçersiz bellek erişimi.

Sıkça Sorulan Sorular

“Sızıntıları Algılama” dersi ücretsiz mi?

Evet — “Sızıntıları Algılama” 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.

“Sızıntıları Algılama” dersinde ne öğreneceğim?

memcheck temelleri 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 2. dersidir.

“Sızıntıları Algılama” 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

  1. Valgrind Neden Kullanılır
  2. Sızıntıları Algılama
  3. Geçersiz Erişim
  4. Raporları Okuma
← C Academy Sayfasına Dön