Bene, penso che siamo tutti d'accordo sul fatto che ciò che accade con il seguente codice non è definito, a seconda di ciò che viene passato,
void deleteForMe(int* pointer)
{
delete[] pointer;
}
Il puntatore potrebbe essere ogni sorta di cose diverse, quindi eseguire un incondizionato delete[]
su di esso non è definito. Tuttavia, supponiamo che stiamo effettivamente passando un puntatore a matrice,
int main()
{
int* arr = new int[5];
deleteForMe(arr);
return 0;
}
La mia domanda è, in questo caso in cui il puntatore è un array, chi lo sa? Voglio dire, dal punto di vista del linguaggio / compilatore, non ha idea se si tratti o meno di arr
un puntatore a matrice rispetto a un puntatore a un singolo int. Diamine, non sa nemmeno se è arr
stato creato dinamicamente. Tuttavia, se invece faccio quanto segue,
int main()
{
int* num = new int(1);
deleteForMe(num);
return 0;
}
Il sistema operativo è abbastanza intelligente da eliminare solo un int e non andare avanti con un qualche tipo di "uccisione di follia" eliminando il resto della memoria oltre quel punto (contrasto che con strlen
e una \0
stringa non terminata - continuerà fino a quando non risultati 0).
Quindi di chi è il compito di ricordare queste cose? Il sistema operativo mantiene un tipo di record in background? (Voglio dire, mi rendo conto di aver iniziato questo post dicendo che ciò che accade è indefinito, ma il fatto è che lo scenario di "omicidio di follia" non accade, quindi quindi nel mondo pratico qualcuno sta ricordando.)