Okay, ich denke, wir sind uns alle einig, dass das, was mit dem folgenden Code passiert, undefiniert ist, je nachdem, was übergeben wird.
void deleteForMe(int* pointer)
{
delete[] pointer;
}
Der Zeiger kann viele verschiedene Dinge sein, und daher delete[]
ist es undefiniert , eine bedingungslose Ausführung durchzuführen . Nehmen wir jedoch an, dass wir tatsächlich einen Array-Zeiger übergeben.
int main()
{
int* arr = new int[5];
deleteForMe(arr);
return 0;
}
Meine Frage ist, in diesem Fall , in dem der Zeiger ist ein Array, wer ist es, das weiß? Ich meine, aus Sicht der Sprache / des Compilers hat es keine Ahnung, ob es sich arr
um einen Array-Zeiger oder einen Zeiger auf ein einzelnes Int handelt. Heck, es weiß nicht einmal, ob arr
dynamisch erstellt wurde. Wenn ich stattdessen Folgendes tue,
int main()
{
int* num = new int(1);
deleteForMe(num);
return 0;
}
Das Betriebssystem ist intelligent genug, um nur einen Int zu löschen und keine Art von "Amoklauf" durchzuführen, indem der Rest des Speichers über diesen Punkt hinaus gelöscht wird (im Gegensatz zu strlen
und einer nicht \0
terminierten Zeichenfolge - es wird so lange fortgesetzt, bis es passiert Treffer 0).
Wessen Aufgabe ist es also, sich an diese Dinge zu erinnern? Hält das Betriebssystem eine Art Aufzeichnung im Hintergrund? (Ich meine, mir ist klar, dass ich diesen Beitrag damit begonnen habe, dass das, was passiert, undefiniert ist, aber Tatsache ist, dass das Szenario „Amoklauf“ nicht vorkommt, also erinnert sich in der praktischen Welt jemand daran.)