delete[] NULL;
-
ist delete[] NULL; legal oder erzeugt das undefiniertes verhalten?
-
IMHO undefiniertes Verhalten.
Da NULL entweder ein ((void*)0) oder eine einfache 0 ist, und Null weder
ein Zeiger auf NULL oder ein mit new angelegter Speicherbereich ist, ist es
laut Standard 5.3.5 -2- undefiniertes Verhalten.Danach denke ich ist delete[] NULL genauso wie:
int Var = 0; delete[] Var;
-
In 5.3.5 Absatz 2 steht aber auch "if the value of the operand of delete is the null pointer the operation has no effect".
In deinem Codebeispiel ist Var übrigens kein Nullpointer, weil kein *konstanter* integraler Ausdruck, der zu 0 ausgewertet wird; daher -> undefiniertes Verhalten.
-
Original erstellt von C Newbie:
Da NULL entweder ein ((void)0)*Darum kann man 'NULL' auch für etwas anderes als void-Zeiger verwenden, nicht?
int Var = 0; delete[] Var;
Quark. '0' (und 'NULL') ist eine Nullzeigerkonstante, die im Zeigerkontext zu einem Nullzeiger wird. 'delete [] 0' stellt einen solchen Zeigerkontext her (weil es im Wesentlichen ein 'operator delete[](0)' oder so ist), damit ist das Verhalten vollständig beschrieben.
-
Also ist 0 gleichzusetzen mit einem NULL-Zeiger ?
int *pNull; pNull = 0; delete[] pNull; //passiert nichts pNull = NULL; delete[] pNull; //hier auch nicht pNull = ((void*)0); delete[] pNull; //siehe beide davor
[Edit] Hat sich nach Daniel's Post erledigt
[ Dieser Beitrag wurde am 24.06.2003 um 21:20 Uhr von C Newbie editiert. ]
-
das dritte wird nicht klappen, weil es in C++ keine automatische Umwandlung von void* zu anderen Zeigern gibt. Ansonsten hast du recht.
-
Hab ich in ner Newsgroup gefunden. Was sagt ihr dazu:
Beware! "delete NULL" is guaranteed to be safe; but "delete [] NULL"
is definitely NOT safe for all compilers! I couldn't believe it when
I saw it, but the version of cfront I'm using definitely generates
unsafe code for "delete [] NULL". I wonder whose brilliant idea this
was?