Mendeteksi Kebocoran
Dasar-Dasar memcheck.
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 ./leakRINGKASAN 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 ./leakKebocoran 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 ./progpada 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=alluntuk memeriksa blok yang masih dapat dijangkau
Selanjutnya: akses memori yang tidak valid.
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
- Mengapa Valgrind
- Mendeteksi Kebocoran
- Akses Tidak Valid
- Membaca Laporan