0Pricing
C Academy · Pelajaran

Kebocoran Memori

Temukan dan hindari kebocoran.

Kebocoran Memori adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 3 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 Memori

Kebocoran memori terjadi ketika Anda mengalokasikan memori heap tetapi tidak pernah membebaskannya, lalu kehilangan satu-satunya penunjuk ke memori tersebut.

Memori itu tetap tercadangkan hingga program berakhir dan membuang sumber daya.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *p = malloc(sizeof(int));
    *p = 5;
    printf("%d\n", *p);
    free(p);
    return 0;
}

Kehilangan Penunjuk

Kebocoran klasik terjadi ketika sebuah penunjuk ditimpa dengan alokasi baru sebelum alokasi lama dibebaskan.

Blok pertama menjadi tidak dapat dijangkau.

#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;
}

Kebocoran dalam Perulangan

Mengalokasikan memori di dalam perulangan tanpa membebaskannya pada setiap iterasi akan memperbesar kebocoran dengan cepat.

Solusinya adalah membebaskan memori sebelum iterasi berikutnya menimpa penunjuk tersebut.

#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;
}

Pengembalian Awal Menyebabkan Kebocoran

return lebih awal setelah alokasi dapat melewati pembersihan. Selalu bebaskan memori pada setiap jalur keluar.

#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;
}

Pola Pembersihan dengan goto

Satu label pembersihan yang dicapai dengan goto memastikan semua memori dibebaskan di satu tempat, sehingga pemanggilan free yang berulang dapat dihindari.

#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;
}

Pasangkan Setiap Alokasi

Aturan paling sederhana: untuk setiap malloc, calloc, atau realloc, harus ada tepat satu free yang sesuai.

#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;
}

Membebaskan Alokasi Bertingkat

Jika sebuah struktur memiliki memori heap, bebaskan penunjuk bagian dalam sebelum membebaskan blok bagian luar.

#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;
}

Membebaskan Larik Penunjuk

Ketika Anda mengalokasikan larik penunjuk dan setiap entrinya merupakan alokasi tersendiri, bebaskan setiap entri terlebih dahulu, lalu lariknya.

#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;
}

Disiplin Kepemilikan

Tentukan siapa yang memiliki setiap alokasi dan bertanggung jawab untuk membebaskannya. Dokumentasikan hal ini agar pemanggil tahu apakah mereka harus membebaskan penunjuk yang dikembalikan.

#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;
}

Alat untuk Menemukan Kebocoran

Alat seperti Valgrind dan AddressSanitizer melaporkan kebocoran dengan melacak setiap alokasi dan menunjukkan alokasi mana yang tidak pernah dibebaskan.

Alat-alat ini penting untuk memverifikasi program nyata.

Siklus Hidup Alokasi yang Bersih

Jika dirangkum: alokasikan, periksa, gunakan, bebaskan pada setiap jalur, lalu jadikan penunjuk bernilai null. Dengan demikian, program tetap bebas dari kebocoran.

#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;
}

Pemeriksaan Cepat

Uji pemahaman Anda tentang kebocoran memori.

Rangkuman

Anda telah mempelajari cara mencegah kebocoran memori:

  • Pasangkan setiap alokasi dengan tepat satu free.
  • Bebaskan memori pada setiap jalur keluar, termasuk pengembalian awal dan galat.
  • Bebaskan alokasi bertingkat dan alokasi larik penunjuk dari bagian dalam terlebih dahulu.
  • Tentukan kepemilikan dengan jelas dan gunakan alat seperti Valgrind untuk melakukan verifikasi.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Kebocoran Memori” gratis?

Ya — teks lengkap “Kebocoran Memori” 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 “Kebocoran Memori”?

Temukan dan hindari kebocoran. 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 3 dari 4.

Berapa lama pelajaran “Kebocoran Memori” 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. malloc dan free
  2. calloc dan realloc
  3. Kebocoran Memori
  4. Pointer Menggantung
← Kembali ke C Academy