C Academy · Pelajaran

Mendeteksi Kebocoran

Dasar-Dasar memcheck.

Pelajaran 2 dari 413 langkah

Mendeteksi Kebocoran adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C Academy mencakup 4 pelajaran total.

Apa Itu Kebocoran

Kebocoran memori terjadi ketika Anda mengalokasikan memori heap dengan malloc, calloc, atau realloc, lalu kehilangan semua pointer ke memori tersebut sebelum memanggil free.

Blok tersebut tetap dipesan tetapi tidak dapat dijangkau sampai proses berakhir. Dalam program yang berjalan lama, kebocoran akan menumpuk hingga memori habis.

Kebocoran Minimal

Program ini membocorkan satu blok berukuran 40 byte.

Pointer p adalah variabel lokal. Ketika main selesai, p menghilang, tetapi blok heap yang ditunjuknya tidak pernah dibebaskan.

#include <stdlib.h>

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

Menjalankan memcheck

memcheck adalah alat bawaan, jadi Anda dapat menghilangkan nama alat tersebut.

Tambahkan --leak-check=full untuk mendapatkan jejak tumpukan bagi setiap alokasi yang bocor.

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

RINGKASAN LEAK

Saat berhenti, Valgrind mencetak RINGKASAN LEAK. Untuk program di atas, hasilnya kira-kira:

definitely lost: 40 bytes in 1 blocks

Jejak tersebut menunjuk ke lokasi pemanggilan malloc yang tepat, sehingga Anda tahu persis alokasi mana yang tidak pernah dibebaskan.

Empat Kategori Kebocoran

memcheck mengelompokkan memori yang hilang ke dalam empat kategori:

  • definitely lost — tidak ada pointer yang tersisa; kebocoran yang sebenarnya
  • indirectly lost — hanya dapat dijangkau melalui blok yang definitely-lost
  • possibly lost — hanya pointer interior yang tersisa
  • still reachable — pointer masih ada saat proses berhenti, tetapi Anda tidak pernah membebaskannya

Definitely Lost vs Still Reachable

definitely lost adalah kategori yang mendesak: byte tersebut tidak akan pernah dapat dipulihkan selama program berjalan.

still reachable lebih ringan. Blok tersebut bocor saat proses berhenti, tetapi pointer global atau statis masih merujuknya, sehingga biasanya ini adalah alokasi satu kali yang tidak pernah sempat Anda bebaskan.

Kebocoran Tidak Langsung

Ketika Anda kehilangan kepala struktur berantai, setiap Node menjadi tidak dapat dijangkau.

Kepala struktur ditampilkan sebagai definitely lost, sedangkan sisanya sebagai indirectly lost. Dengan memperbaiki akar masalah, yaitu kepala yang hilang, semuanya dapat dipulihkan.

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 */

Versi yang Diperbaiki

Bebaskan apa pun yang Anda alokasikan. Versi ini tidak mengalami kebocoran.

Di bawah Valgrind, hasilnya adalah 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;
}

Menghitung Alokasi

Bahkan tanpa kebocoran, RINGKASAN HEAP memberi tahu seberapa sibuk program Anda:

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

Jika jumlah allocs dan frees sama, eksekusinya bersih. Ketidaksesuaian adalah petunjuk pertama bahwa ada sesuatu yang terlepas.

Menampilkan Blok yang Dapat Dijangkau

Secara bawaan, memcheck tidak mencantumkan blok still reachable secara terperinci. Untuk memeriksanya juga, tambahkan:

--show-leak-kinds=all

Ini memaksa Valgrind menampilkan jejak untuk setiap kategori, berguna jika Anda ingin program membebaskan semuanya sebelum berhenti.

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

Kebocoran pada Jalur Kesalahan

Kebocoran yang paling sulit ditemukan tersembunyi pada jalur yang mengembalikan hasil lebih awal. Di sini, jika alokasi kedua gagal, blok pertama bocor.

Pengujian biasa jarang mencapai cabang-cabang ini, tetapi memcheck akan menangkapnya setiap kali jalur tersebut dijalankan. Selalu bebaskan apa pun yang Anda pegang sebelum mengembalikan hasil saat terjadi kesalahan.

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

Pemeriksaan Singkat

Pilih kategori kebocoran yang paling mendesak untuk ditangani.

Rangkuman

Sekarang Anda dapat mendeteksi kebocoran dengan memcheck:

  • Jalankan valgrind --leak-check=full ./prog pada berkas biner dengan opsi -g
  • Baca RINGKASAN LEAK dan RINGKASAN HEAP
  • Prioritaskan definitely lost, lalu telusuri kebocoran tidak langsung hingga ke akarnya
  • Gunakan --show-leak-kinds=all untuk memeriksa blok yang masih dapat dijangkau

Selanjutnya: akses memori yang tidak valid.

Gratis untuk memulai

Belajar C dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
39
Pelajaran
144

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Mendeteksi Kebocoran” gratis?

Ya — teks lengkap “Mendeteksi Kebocoran” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C Academy, upgrade ke CoddyKit PRO. Kursus C Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Mendeteksi Kebocoran”?

Dasar-Dasar memcheck. Kamu berlatih C Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C Academy?

Tidak diperlukan pengalaman sebelumnya. C Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Mendeteksi Kebocoran” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C Academy ini?

Ya. Setiap pelajaran C Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mengapa Valgrind
  2. Mendeteksi Kebocoran
  3. Akses Tidak Valid
  4. Membaca Laporan
← Kembali ke C Academy