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?

    😕


Anmelden zum Antworten