Ini adalah sesuatu yang telah menggangguku sejak lama.
Kita semua diajarkan di sekolah (setidaknya, saya dulu) bahwa Anda HARUS membebaskan setiap pointer yang dialokasikan. Saya agak penasaran, tentang biaya sebenarnya dari tidak membebaskan memori. Dalam beberapa kasus yang jelas, seperti ketika malloc
dipanggil di dalam loop atau bagian dari eksekusi thread, sangat penting untuk membebaskan sehingga tidak ada kebocoran memori. Tetapi perhatikan dua contoh berikut:
Pertama, jika saya memiliki kode itu kira-kira seperti ini:
int main()
{
char *a = malloc(1024);
/* Do some arbitrary stuff with 'a' (no alloc functions) */
return 0;
}
Apa hasil sebenarnya di sini? Pemikiran saya adalah bahwa proses tersebut mati dan kemudian ruang tumpukan hilang sehingga tidak ada salahnya melewatkan panggilan untuk free
(namun, saya mengakui pentingnya memilikinya untuk penutupan, perawatan, dan praktik yang baik). Apakah saya benar dalam pemikiran ini?
Kedua, katakanlah saya memiliki program yang sedikit mirip shell. Pengguna dapat mendeklarasikan variabel suka aaa = 123
dan mereka disimpan dalam beberapa struktur data dinamis untuk digunakan nanti. Jelas, tampaknya jelas bahwa Anda akan menggunakan beberapa solusi yang akan memanggil beberapa fungsi alokasi * (hashmap, daftar tertaut, sesuatu seperti itu). Untuk program semacam ini, tidak masuk akal untuk bebas setelah menelepon malloc
karena variabel-variabel ini harus ada setiap saat selama pelaksanaan program dan tidak ada cara yang baik (yang bisa saya lihat) untuk mengimplementasikannya dengan ruang yang dialokasikan secara statis. Apakah desain yang buruk memiliki banyak memori yang dialokasikan tetapi hanya dibebaskan sebagai bagian dari proses berakhir? Jika demikian, apa alternatifnya?
free(a)
tidak benar-benar melakukan apa pun untuk benar-benar membebaskan memori! Itu hanya me-reset beberapa petunjuk dalam implementasi libc dari malloc yang melacak potongan memori yang tersedia di dalam halaman memori mmapped besar (biasanya disebut "heap"). Halaman itu masih akan dibebaskan hanya ketika program Anda berakhir, bukan sebelumnya.