So löschen Sie die aktuelle Instanz der Klasse mit Hilfe einer member-Funktion der gleichen Klasse
Im folgenden code, habe ich mein Konstruktor und Destruktor private und schuf meine eigene Instanziierung und löschen Funktionen. Aber wenn ich rufen Sie die Delete()
Funktion, die delete this
- Anweisung im inneren, es scheint, das Objekt entfernen, aber nicht informieren Sie den compiler aus, damit es denkt, dass das Objekt noch existiert. Ich dachte, es wäre eine gute Idee, den Zeiger auf null oder auf null, also habe ich ein this = 0
vor der delete-Anweisung, aber es hat überhaupt nicht funktioniert. Was soll ich in der Delete()
Funktion, um vollständig zu löschen Sie das Objekt und Zeiger?
class MyClass
{
private:
MyClass() {}
~MyClass() {}
public:
static MyClass *Instantiate()
{
MyClass *inst = new MyClass;
return inst;
}
void Delete()
{
delete this;
}
};
int main()
{
MyClass *inst1 = MyClass::Instantiate();
inst1->Delete();
return 0;
}
- "aber nicht informieren Sie den compiler aus, damit es denkt, dass das Objekt noch existiert" - Was macht Sie sagen?
- Da kann ich nicht wiederverwenden, das Objekt name
- Bitte entfernen Sie das 'Diese Frage vielleicht schon hier eine Antwort' - label. Meine Frage bezieht sich nicht auf die Frage, die Sie erwähnt.
- das banner entfernt werden, wenn die (fehlerhafte) Stimmen verfallen. Und nur Sie können es sehen, ist es nicht angezeigt, für andere Nutzer.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Obwohl Sie nicht explizit Ausdrücken, ich glaube, dass Sie sich Fragen, warum
inst1
ist nichtNULL
nach dem aufrufenDelete()
. Wenn dem so ist, betrachten Sie dieses:Mit
inst1->Delete();
Sie erfolgreich löschen Sie das Objektinst1
hinwies. Aber die Zeigerinst1
bleibt unverändert. Es werden nur Punkte irgendwo im Speicher das ist nicht mehr eine gültige Instanz desMyClass
.Außerdem ist es äußerst ungewöhnlich, dass eine Mitglied-Funktion zum aufrufen
delete this
, obwohl syntaktisch und semantisch gibt es nichts falsch mit deinem Beispiel.this = 0
funktioniert nicht)Können Sie dies tun. Zeiger auf das Objekt geführt werden müssen extern, als das Objekt selbst hat keinen Zugang zu Ihnen haben (
this
ist eine lokale, sich selbst verweisende Zeiger und nicht für etwas anderes als das.)Wenn Sie wollte, um zu verfolgen die Zeiger automatisch, verwenden Sie eine smart-pointer-Klasse (http://en.wikipedia.org/wiki/Smart_pointer#C.2B.2B_smart_pointers). Aber da man aus den dtor privaten, verlieren Sie diese Fähigkeit. Können Sie noch schreiben Sie Ihre eigenen smart-pointer-Klasse, natürlich.