Wann sollte ich einen Destruktor für meine Klasse bereitstellen?

Dies scheint eine eher triviale oder zumindest häufige Frage zu sein, aber ich konnte auf Google oder SO keine zufriedenstellende Antwort finden.

Ich bin mir nicht sicher, wann ich einen Destruktor für meine Klasse implementieren soll.

Ein offensichtlicher Fall ist, wenn die Klasse eine Verbindung zu einer Datei umschließt und ich sicherstellen möchte, dass die Verbindung geschlossen ist, damit ich sie im Destruktor schließe.

Aber ich möchte im Allgemeinen wissen, wie ich wissen kann, ob ich einen Destruktor definieren soll. Welche Richtlinien gibt es, die ich überprüfen kann, um festzustellen, ob ich einen Destruktor in dieser Klasse haben sollte?

Eine solche Richtlinie, die mir einfällt, ist, wenn die Klasse Member-Zeiger enthält. Der Standard-Destruktor würde die Zeiger beim Löschen löschen, aber nicht die Objekte, auf die sie zeigen. Das sollte also die Arbeit eines benutzerdefinierten Destruktors sein. Beispiel: (Ich bin ein C ++ - Neuling, daher kann dieser Code möglicherweise nicht kompiliert werden.)

class MyContainer {
public:
    MyContainer(int size) : data(new int[size]) { }
    ~MyContainer(){
        delete [] data;
    }
    // .. stuff omitted
private:
    int* data;
}

Wenn ich diesen Destruktor nicht geliefert hätte, als ein @ zu zerstörMyContainerin @ -Objekt würde bedeuten, ein Leck zu erzeugen, da alle zuvor von @ referenzierten Datdata wäre nicht gelöscht worden.

Aber ich habe zwei Fragen:

1- Ist das die einzige Richtlinie? Das heißt Destruktor definieren, wenn die Klasse über Member-Zeiger verfügt oder eine Ressource verwaltet? Oder gibt es sonst noch etwas?

2- Gibt es Fälle, in denen ich @ sollnich delete Mitgliedszeiger? Was ist mit Referenzen?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage