Ada dua tempat di mana variabel bisa dimasukkan ke dalam memori. Saat Anda membuat variabel seperti ini:
int a;
char c;
char d[16];
Variabel dibuat di " tumpukan ". Variabel tumpukan secara otomatis dibebaskan saat berada di luar ruang lingkup (yaitu, saat kode tidak dapat menjangkau mereka lagi). Anda mungkin mendengarnya disebut variabel "otomatis", tetapi itu sudah ketinggalan zaman.
Banyak contoh pemula hanya akan menggunakan variabel tumpukan.
Tumpukan itu bagus karena otomatis, tetapi juga memiliki dua kelemahan: (1) Kompilator perlu mengetahui sebelumnya seberapa besar variabelnya, dan (b) ruang tumpukan agak terbatas. Misalnya: di Windows, di bawah pengaturan default untuk Microsoft linker, tumpukan diatur ke 1 MB, dan tidak semuanya tersedia untuk variabel Anda.
Jika Anda tidak tahu pada waktu kompilasi seberapa besar array Anda, atau jika Anda membutuhkan array atau struct yang besar, Anda memerlukan "plan B".
Rencana B disebut dengan " heap ". Anda biasanya dapat membuat variabel sebesar yang diizinkan Sistem Operasi, tetapi Anda harus melakukannya sendiri. Posting sebelumnya menunjukkan kepada Anda satu cara untuk melakukannya, meskipun ada cara lain:
int size;
char *p = (char *)malloc(size);
(Perhatikan bahwa variabel di heap tidak dimanipulasi secara langsung, tetapi melalui pointer)
Setelah Anda membuat variabel heap, masalahnya adalah kompilator tidak dapat mengetahui saat Anda selesai menggunakannya, jadi Anda kehilangan pelepasan otomatis. Di situlah "pelepasan manual" yang Anda maksud masuk. Kode Anda sekarang bertanggung jawab untuk memutuskan kapan variabel tidak diperlukan lagi, dan melepaskannya sehingga memori dapat diambil untuk tujuan lain. Untuk kasus diatas, dengan:
free(p);
Apa yang membuat opsi kedua ini "bisnis yang buruk" adalah tidak selalu mudah untuk mengetahui kapan variabel tidak diperlukan lagi. Lupa melepaskan variabel saat Anda tidak membutuhkannya akan menyebabkan program Anda menghabiskan lebih banyak memori yang diperlukannya. Situasi ini disebut "kebocoran". Memori "bocor" tidak dapat digunakan untuk apa pun hingga program Anda berakhir dan OS memulihkan semua sumber dayanya. Masalah yang lebih buruk pun mungkin terjadi jika Anda melepaskan variabel heap secara tidak sengaja sebelumnya Anda benar-benar selesai menggunakannya.
Di C dan C ++, Anda bertanggung jawab untuk membersihkan variabel heap seperti yang ditunjukkan di atas. Namun, ada bahasa dan lingkungan seperti Java dan bahasa .NET seperti C # yang menggunakan pendekatan berbeda, di mana heap dibersihkan sendiri. Metode kedua ini, yang disebut "pengumpulan sampah", jauh lebih mudah bagi pengembang tetapi Anda harus membayar denda dalam biaya overhead dan kinerja. Itu keseimbangan.
(Saya telah menutupi banyak detail untuk memberikan jawaban yang lebih sederhana, tetapi mudah-mudahan lebih rata)