delete bei Klassen



  • Also stimmt die Funktion free(); so oder nicht.Das war eig. meine Frage.


  • Mod

    4ex0F2 schrieb:

    Also stimmt die Funktion free(); so oder nicht.Das war eig. meine Frage.

    Ich bin mir sehr sicher, dass du hier sehr grundlegende Dinge über Klassen, Objekte und dynamische Speicherverwaltung nicht verstanden hast. Ich kann aber nicht genau den Finger drauf legen, was genau dein Problem ist, da du dich sehr kurz fasst. Jedenfalls ist der Code mehr als ungewöhnlich.



  • Nein.

    void free(MyClass* meineklasse)
    

    bezeichnet keine Methode. Du könntest

    void MyClass::free()
    

    schreiben, aber wenn du in deinem Code

    delete this;
    

    stehen hast, will ich nicht mit dir zusammenarbeiten müssen.

    Überhaupt ist nacktes new/delete keine gute Idee. Besser:

    std::unique_ptr<MyClass> mc = new MyClass();
    

    oder gleich

    MyClass mc;
    

    Wir sind hier ja nicht im Java-Forum.



  • ist

    MyClass* p = new MyClass;
    p->free(p);
    

    überhaupt ein definiertes Verhalten? Also wenn die Methode das Objekt deleted, mit dem sie aufgerufen wurde?



  • mich wuerds ned wundern wenn ein compiler auf delete this mit "geh hin(fort) und lies ein buch" antworten wuerd ...

    // ok, aber guter stil[tm] kanns ned sein...





  • Ich sags mal so. Das geht an sich schon, ist "richtig" in dem Sinne, das es wohl funktioniert (vorausgesetzt, du schreibst wie seldon bemerkt hat void MyClass::free(MyClass* meineklasse){delete meineklasse;} )

    Aber warum sollte man sowas machen?

    Planst du sowas?

    MyClass* p = new MyClass;
    //Do stuff
    p->free(p);
    

    Warum nicht gleich

    MyClass* p = new MyClass;
    //Do stuff
    delete p;
    

    ?

    Deine Funktion, so wie du sie vorschlägst ist einfach sinnlos. Deswegen fällt es den Leuten auch so schwer, die Frage zu beantworten, ob sie "richtig" sei.



  • @kleinerTroll: Wieso nicht gleich Myclass mc; ? Sind Stackobjekte verboden oder was? Wie seldon schon gesagt hat, wir sind hier nicht im Java-Forum.

    Ich dachte einen kleinen Moment, er will den delete-operator überladen (was ich ihm garantiert nicht empfehlen würde).

    Vielleicht will der TE ja wissen, was ein Destruktor ist.



  • seldon schrieb:

    Überhaupt ist nacktes new/delete keine gute Idee. Besser:

    std::unique_ptr<MyClass> mc = new MyClass();
    

    Das hat der Herr Stroustrup in seinem GoingNative2012 keynote talk auch gebracht. Allerdings ist der unique_ptr-Konstruktor, der einen rohen Zeiger entgegen nimmt, explicit . Du musst also die direkte Initialisierung hierfür nutzen; denn diese Kopierinitialisierung wird nicht functionieren -- zumindest nicht portabel. Mag sein, dass Microsoft da das explicit vergessen hat, so wie sie das auch schon bei auto_ptr vergessen haben (wenn ich mich da richtig erinnere).

    seldon schrieb:

    oder gleich

    MyClass mc;
    

    Wir sind hier ja nicht im Java-Forum.

    Sicher. Wenn so die Lebenszeit von mc kein Problem darstellt und die MyClass-Definition kein großes, "direktes" Array als Datenelement besitzt, ist das völlig in Ordnung und sollte sogar bevorzugt werden.



  • @kleinerTroll: Wieso nicht gleich Myclass mc; ? Sind Stackobjekte verboden oder was? Wie seldon schon gesagt hat, wir sind hier nicht im Java-Forum.

    Hin und wieder braucht man halt new+delete. Es schadet einem Anfänger nicht, das zu verstehen. Ihr habt ja recht das man es meist vermeiden kann (und soll), das hilft aber nicht zu erklären wie man es denn verwendet, wenn man muss.


Anmelden zum Antworten