Membebaskan Memori dan Menghindari Kebocoran
Bersihkan dengan benar.
Membebaskan Memori dan Menghindari Kebocoran adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.
Setiap malloc Memerlukan free
Memori heap tetap dipesan sampai Anda melepaskannya dengan free. Jika Anda kehilangan satu-satunya penunjuk ke sebuah blok tanpa membebaskannya, memori tersebut bocor.
Kebocoran menumpuk seiring waktu dan dapat menghabiskan memori dalam program yang berjalan lama.
int *a = malloc(100 * sizeof(*a));
/* ... use a ... */
free(a);Apa yang Sebenarnya Dilakukan free
free(p) mengembalikan blok ke pengalokasi agar dapat digunakan kembali. Fungsi ini tidak mengubah nilai p itu sendiri.
Setelah free, p masih menunjuk ke alamat lama, yang kini tidak valid. Mengaksesnya merupakan perilaku yang tidak terdefinisi.
free(p);
/* p is now a dangling pointer */Jebakan Penunjuk Menggantung
Menggunakan penunjuk setelah membebaskannya adalah kesalahan penggunaan setelah pembebasan. Kode mungkin tampak berfungsi, lalu merusak data atau tiba-tiba mengalami kerusakan.
Pengamanan sederhana adalah mengatur penunjuk menjadi NULL tepat setelah pembebasan.
free(a);
a = NULL; /* now misuse is a clean NULL deref, easier to catch */Double Free Merupakan Perilaku Tidak Terdefinisi
Memanggil free dua kali pada blok yang sama akan merusak keadaan internal pengalokasi dan sering menyebabkan program berhenti.
Mengatur penunjuk menjadi NULL setelah pembebasan pertama akan membantu, karena free(NULL) secara eksplisit aman dan tidak melakukan apa-apa.
free(a);
a = NULL;
free(a); /* free(NULL) is a harmless no-op */Bebaskan Hanya Memori yang Anda Alokasikan dengan malloc
Berikan kepada free hanya penunjuk yang berasal dari malloc, calloc, atau realloc.
Membebaskan alamat variabel stack, literal string, atau penunjuk ke bagian tengah blok merupakan perilaku yang tidak terdefinisi.
int x = 5;
/* free(&x); WRONG: x is on the stack */
int *p = malloc(sizeof(int));
free(p); /* correct */Kebocoran akibat Pengembalian Lebih Awal
Kebocoran yang umum terjadi: Anda melakukan alokasi, lalu menemui jalur kesalahan yang mengembalikan fungsi sebelum pembebasan dilakukan. Blok tersebut pun hilang.
Pastikan setiap jalur keluar yang memiliki memori tersebut membebaskannya terlebih dahulu.
int *a = malloc(n * sizeof(*a));
if (something_failed) {
free(a); /* don't forget this before returning */
return -1;
}Program Alokasi dan Pembebasan yang Bersih
Program ini mengalokasikan, menggunakan, dan membebaskan memori di setiap jalur, tanpa membocorkan apa pun.
#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;
}Membebaskan Alokasi Bertingkat
Jika sebuah blok berisi penunjuk ke blok-blok lain, bebaskan blok bagian dalam terlebih dahulu, kemudian blok bagian luar.
Membebaskan blok bagian luar lebih dahulu akan menghilangkan alamat blok-blok bagian dalam dan menyebabkannya bocor.
for (size_t i = 0; i < rows; i++)
free(grid[i]); /* free each row first */
free(grid); /* then the array of pointers */Satu Pemilik untuk Setiap Blok
Tentukan bagian kode Anda yang memiliki setiap alokasi dan bertanggung jawab untuk membebaskannya.
Jika dua penunjuk merujuk ke blok yang sama dan keduanya membebaskannya, Anda akan mengalami pembebasan ganda. Kepemilikan yang jelas mencegahnya.
Mendeteksi Kebocoran dengan Alat
Anda tidak harus menemukan kebocoran hanya dengan melihat kode. Alat seperti valgrind atau AddressSanitizer melaporkan kebocoran dan pembebasan yang tidak valid beserta nomor barisnya.
Kompilasi dengan -g dan jalankan di bawah alat tersebut untuk melihat dengan tepat apa yang tidak dibebaskan.
/* gcc -g -fsanitize=address prog.c && ./a.out */
/* or: valgrind --leak-check=full ./a.out */Bebaskan dalam Urutan Terbalik dari Penyiapan
Kebiasaan yang dapat diandalkan: dalam fungsi yang memperoleh beberapa sumber daya, lepaskan sumber daya tersebut dalam urutan terbalik dari saat Anda memperolehnya.
Hal ini mencerminkan cara dependensi dibangun dan membuat pembersihan lebih mudah diprediksi.
char *buf = malloc(64);
int *idx = malloc(64 * sizeof(int));
/* ... use them ... */
free(idx); /* free last-acquired first */
free(buf);Pemeriksaan Singkat
Uji pemahaman Anda tentang pembebasan memori.
Ringkasan
Pasangkan setiap alokasi dengan tepat satu free di setiap jalur kode.
Hindari penunjuk menggantung dan pembebasan ganda dengan mengatur penunjuk menjadi NULL setelah pembebasan. Bebaskan alokasi bertingkat mulai dari bagian dalam, tetapkan satu pemilik untuk setiap blok, dan gunakan valgrind atau ASan untuk menemukan kebocoran. Kini Anda telah memiliki seluruh perangkat kerja untuk larik dinamis.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Membebaskan Memori dan Menghindari Kebocoran” gratis?
Ya — teks lengkap “Membebaskan Memori dan Menghindari 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 “Membebaskan Memori dan Menghindari Kebocoran”?
Bersihkan dengan benar. 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 4 dari 4.
Berapa lama pelajaran “Membebaskan Memori dan Menghindari 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
- Mengalokasikan Larik
- Memperbesar dengan realloc
- Tipe Vektor yang Dapat Digunakan Kembali
- Membebaskan Memori dan Menghindari Kebocoran