Baiklah, saya pikir kita semua setuju bahwa apa yang terjadi dengan kode berikut tidak ditentukan, tergantung pada apa yang diteruskan,
void deleteForMe(int* pointer)
{
delete[] pointer;
}
Pointer dapat berupa segala macam hal yang berbeda, sehingga melakukan tanpa syarat delete[]
di atasnya tidak ditentukan. Namun, mari kita asumsikan bahwa kita memang mengoper pointer array,
int main()
{
int* arr = new int[5];
deleteForMe(arr);
return 0;
}
Pertanyaan saya adalah, dalam hal ini di mana pointernya adalah sebuah array, siapa yang mengetahui hal ini? Maksud saya, dari sudut pandang bahasa / kompiler, ia tidak tahu apakah arr
pointer array versus pointer ke int tunggal. Heck, bahkan tidak tahu apakah arr
diciptakan secara dinamis. Namun, jika saya melakukan hal berikut,
int main()
{
int* num = new int(1);
deleteForMe(num);
return 0;
}
OS cukup pintar untuk hanya menghapus satu int dan tidak melakukan beberapa jenis 'pembunuhan foya' dengan menghapus sisa memori di luar titik itu (kontras dengan strlen
dan \0
string yang tidak diakhiri - itu akan terus berjalan sampai itu hits 0).
Jadi tugas siapa mengingat hal-hal ini? Apakah OS menyimpan beberapa jenis catatan di latar belakang? (Maksud saya, saya menyadari bahwa saya memulai posting ini dengan mengatakan bahwa apa yang terjadi tidak ditentukan, tetapi kenyataannya adalah, skenario 'pembunuhan foya' tidak terjadi, jadi oleh karena itu dalam dunia praktis seseorang mengingat.)