delete bei Klassen
-
Hallo!
Also hier ist meine Beispiel Klasse :
class MyClass { public : MyClass(); void free(); //hier ist meine Frage };So wenn ich die Klasse nun so implentiere :
MyClass* mc = new MyClass();dann brauche ich ja als gegenstück für
new deletestimmt es dann, wenn die free(); Funktion so aussieht :
void free(MyClass* meineklasse){delete meineklasse;}?
Danke sehr im voraus
-
Hä?
Wie kommst du darauf, dass du so eine Funktion implementieren musst?!Ein einfaches
delete mc;reicht schon.
-
Also stimmt die Funktion free(); so oder nicht.Das war eig. meine Frage.
-
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 thismit "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.