new frage



  • Also hier ist der Link: http://www.microsoft.com/msj/archive/S202C.aspx
    (Die Frage ganz unten)

    Ein Zitat von Bjarne Stroustrup: "The effect of deleting an array with the plain delete syntax is undefined, as is deleting an individual object with the delete [] syntax."

    Somit hast du natürlich prinzipiell Recht. Entschuldige daher, dass ich unnütze Informationen verbreitet habe, denn wen interessiert es schon bei welchem Compiler es keine Probleme gibt wenn man ein Array nur mit delete löscht.



  • Der Aufruf delete für ein Array- Objekt hat keineswegs ein undefiniertes Verhalten.
    Es wird nur das erste Array- Element gelöscht, nach verlassen des Sichtbarkeitsbereich ist den Pointer auf das Array nicht mehr vorhanden und der Speicher liegt unerreichbar herum.



  • LoL



  • Hume Sikkins schrieb:

    Nein. 😡

    Doch!

    Paul DiLascia im Microsoft System Journal, Septempber 1996:

    With most library implementations, you won't get into trouble allocating simple C arrays like char[256] and then deleting them without []. In fact, I see this quite frequently in real code.

    p = new char[256]
    .
    .
    .
    delete p;        // should be delete [] p
    

    Since no destructors are involved, this is safe. However, the [] brackets are crucial for arrays of objects with destructors, and real programming pros always insert them, even for char arrays, out of good habit and just to show off how smart they are.



  • With most library implementations



  • Spawn schrieb:

    Der Aufruf delete für ein Array- Objekt hat keineswegs ein undefiniertes Verhalten.
    Es wird nur das erste Array- Element gelöscht, nach verlassen des Sichtbarkeitsbereich ist den Pointer auf das Array nicht mehr vorhanden und der Speicher liegt unerreichbar herum.

    Wo im Standard soll das stehen?



  • Keine Ahnung, wo das steht, aber das Programm zeigt das Verhalten

    #include<iostream>
    #include<stdlib.h>
    
    using namespace std;
    
    class X{
    public:
        X(){cout << "Konstruktor" << endl;}
        ~X(){cout << "Destruktor" << endl;}
    };
    
    int main(){
        X* x = new X[10];
        delete x;
        system("Pause");
    }
    


  • übler Scherz von dir.



  • Spawn schrieb:

    Keine Ahnung, wo das steht, aber das Programm zeigt das Verhalten

    char* p=0;
    *p='x';
    

    das funktioniert bei mir. Ist das jetzt legales C++?



  • Also wenn Struppi was sagt, dann stimmt das! Da kann dann auch kein MSDN-sonstewas-Experte was dran ändern.
    Ich meine: Wer wird es besser wissen: der Vater von C++ oder ein Microsoftmitarbeiter?



  • Spawn schrieb:

    Keine Ahnung, wo das steht, aber das Programm zeigt das Verhalten

    Anscheinend hat es sich bei Neulingen eingebürgert, "undefiniert" zu sagen wenn "stürzt ab" gemeint ist. Nunja, das ist falsch. Dein Programm -- oder irgendein anderes Beispielprogramm -- interessiert nicht, wenn es um die Frage geht, ob das Verhalten definiert ist oder nicht. Definiert ist es, wenn im Standard vorgeschrieben ist, was dann zu passieren hat. Undefiniert ist es, wenn der Standard keinerlei Anforderungen an das Verhalten stellt.
    (In Abschnitt 5.3.5 kann man sich über delete und delete[] schlau machen.)
    http://anubis.dkuug.dk/jtc1/sc22/open/n2356/



  • Hallo,
    also erstmal möchte ich darauf hinweisen, dass ich niemals unregistriert poste. Also nicht verwechseln.

    Als nächste kann ich nur sagen, dass mir eure Ignoranz manchmal die Sprache raubt. Entweder man weiß etwas, dann kann man auch das Maul aufreißen oder man weiß es nicht, dann hält man sich besser an den bekannten Rat von Dieter Nuhr. Alternativ kann man natürlich auch gerne Nachfragen. Nur sollte man sich nicht an unhaltbare Behauptungen klammern.

    Zum Thema:
    Im Standard steht unter 5.3.5/2:

    In the first alternativ (delete object), the value of the operand of delete shall be a pointer to a non-array object or a pointer to a sub-object representing a base class of such an object[...]. If not, the behavior is undefined.

    Es spielt keine Rolle was Paul DiLascia in irgendeinem Journal schreibt und noch weniger spielt es eine Rolle, was irgendein Spawn auf irgendeinem Compiler für ein Ergebnis gesehen haben möchte.

    Statt hier sinnlos zu disktuieren, sollte man sich schlicht und einfach eine Sache merken: Zu new passt delete und zu new[] passt delete[]. Fertig.

    Alle die mehr wissen wollen, kommen nicht drum rum sich zuvor mit ein paar hässlichen Details zu beschäftigen. Dazu gehören auch solche Dinge wie die Bedeutung von "undefiniertem Verhalten".


Anmelden zum Antworten