Jika Anda tidak mengetahui ukuran pasti dari memori yang perlu Anda gunakan, Anda memerlukan alokasi dinamis ( malloc
). Contohnya mungkin ketika pengguna membuka file di aplikasi Anda. Anda perlu membaca konten file ke dalam memori, tetapi tentu saja Anda tidak mengetahui ukuran file sebelumnya, karena pengguna memilih file tersebut di tempat, saat runtime. Jadi pada dasarnya Anda perlu malloc
ketika Anda tidak mengetahui ukuran data yang Anda kerjakan sebelumnya. Setidaknya itulah salah satu alasan utama penggunaan malloc
. Dalam contoh Anda dengan string sederhana yang sudah Anda ketahui ukurannya pada waktu kompilasi (ditambah Anda tidak ingin mengubahnya), tidak masuk akal untuk mengalokasikannya secara dinamis.
Sedikit keluar dari topik, tapi ... Anda harus sangat berhati-hati agar tidak menyebabkan kebocoran memori saat menggunakan malloc
. Pertimbangkan kode ini:
int do_something() {
uint8_t* someMemory = (uint8_t*)malloc(1024);
// Do some stuff
if ( /* some error occured */ ) return -1;
// Do some other stuff
free(someMemory);
return result;
}
Apakah Anda melihat apa yang salah dengan kode ini? Ada pernyataan pengembalian bersyarat antara malloc
danfree
. Awalnya mungkin tampak baik-baik saja, tetapi pikirkanlah. Jika ada kesalahan, Anda akan kembali tanpa membebaskan memori yang Anda alokasikan. Ini adalah sumber kebocoran memori yang umum.
Tentu saja ini adalah contoh yang sangat sederhana, dan sangat mudah untuk melihat kesalahannya di sini, tetapi bayangkan ratusan baris kode berserakan dengan pointer, malloc
s,free
s, dan segala macam penanganan kesalahan. Segalanya bisa menjadi sangat berantakan dengan sangat cepat. Ini adalah salah satu alasan saya lebih memilih C ++ modern daripada C dalam kasus yang berlaku, tetapi itu topik yang sama sekali berbeda.
Jadi, kapan pun Anda menggunakan malloc
, selalu pastikan memori Anda free
sedapat mungkin.
malloc()
dapat gagal!