new frage



  • also das muss dann wirklich ein schlechtes tutorial sein.
    was hast du denn da z.b. anzubieten?



  • hiho schrieb:

    ich frag mich dann aber wieso das in vielen tutorials nicht so ist?

    Vielleicht weil es unendlich viel mehr schlechte als gute Tutorials gibt.



  • Grundsätzlich sollte man es sich angewöhnen, alles was man mit new oder new[] an Speicher alloziert hat, auch wieder mit delete oder delete[] freizugeben.
    Du musst es nicht machen, es ist aber sauberer und du bekommst den Speicher wieder freigegeben.
    Verlässt du den Sichtbarkeitsbereich der Variablen, ohne vorher delete aufzurufen, liegt der Speicherbereich irgendwo rum und du kanns nicht mehr darauf zugreifen.
    Er ist also für die Laufzeit des Programms verloren.



  • Spawn schrieb:

    Du musst es nicht machen, es ist aber sauberer und du bekommst den Speicher wieder freigegeben.

    Müssen tut man garnix - aber es bringt halt nur Nachteile mit sich.



  • Bei Basistypen wie int, char, float etc. treten keine memory leaks auf wenn man zuvor mit new ein Array eines dieser Datentypen erzeugt und dieses nachher mittels delete löscht. Wenn man aber ein Array von (komplizierten) Klassenobjekten (w.z.B. std::string) am Heap erzeugt, und diesen nicht mit delete[] löscht, dann verursacht man mit Gewissheit memory leaks.

    Trotzdem ist es natürlich sehr zu empfehlen einzelne Objekte mit delete und Arrays mit delete[] zu löschen.



  • Spawn schrieb:

    Du musst es nicht machen, es ist aber sauberer und du bekommst den Speicher wieder freigegeben.

    In einem System, das beispielsweise über mehrere Jahre ununterbrochen laufen können muß, wirst Du nicht drum herum kommen den Speicher freizugeben, den Du nicht mehr benötigst. Sonst wirst Du irgendwann schlicht keinen Speicher mehr haben und mußt abbrechen. Das wäre z.B. für eine Sicherheitssteuerung in einem Kernkraftwerk eine sehr unschöne Sache.



  • Aziz schrieb:

    Bei Basistypen wie int, char, float etc. treten keine memory leaks auf wenn man zuvor mit new ein Array eines dieser Datentypen erzeugt und dieses nachher mittels delete löscht. Wenn man aber ein Array von (komplizierten) Klassenobjekten (w.z.B. std::string) am Heap erzeugt, und diesen nicht mit delete[] löscht, dann verursacht man mit Gewissheit memory leaks.

    Hör doch bitte auf solche sinnlosen Informationen zu verbreiten. Der Aufruf von delete (statt delete[]) auf einem Array hat undefiniertes Verhalten. Egal ob das nun ein Array von ints oder Foos ist. Punkt. Jeder weitere Diskussion ist sinnlos, da undefiniertes Verhlatn nun mal undefiniert ist. Memory-Leaks sind hier dein kleinstes Problem. Und das Problem ist auch nicht unbedingt theoretischer Natur. Schließlich kann man die Funktionen new/new[] und delete/delete[] auch global überladen.

    Du musst es nicht machen, es ist aber sauberer und du bekommst den Speicher wieder freigegeben

    Wer der Meinung ist, er müsse hier kein delete aufrufen, der soll Visual Basic programmieren statt C++ oder noch besser einfach anfangen Abziehbildchen zu sammeln.



  • HumeSikkins schrieb:

    Hör doch bitte auf solche sinnlosen Informationen zu verbreiten. Der Aufruf von delete (statt delete[]) auf einem Array hat undefiniertes Verhalten. Egal ob das nun ein Array von ints oder Foos ist. Punkt. Jeder weitere Diskussion ist sinnlos, da undefiniertes Verhlatn nun mal undefiniert ist. Memory-Leaks sind hier dein kleinstes Problem. Und das Problem ist auch nicht unbedingt theoretischer Natur. Schließlich kann man die Funktionen new/new[] und delete/delete[] auch global überladen.

    Den Unsinn hab ich von Paul DiLascia. Er schreibt Artikel für das MSDN Magazin.
    Ich werd mal versuchen den Artikel ausfindig zu machen, in dem er dieses Thema behandelt hat...

    Du hast außerdem Recht, dass man die Funktionen überladen kann. Ich hätte mich vielleicht etwas genauer ausdrücken sollen in meinem Beitrag von vorhin.



  • Es ist einfach so: delete[] ruft noch die Destruktoren der einzelnen Elemente auf und delete tut das nicht. Da int keinen Destruktor hat ist bei einem int-Array auch delete OK. Allerdings ist es besser, man gewöhnt sich bei Arrays immer an mit delete[] freizugeben, dann vergisst man es nicht so schnell.



  • Da int keinen Destruktor hat ist bei einem int-Array auch delete OK.

    Nein. 😡



  • 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?


Anmelden zum Antworten