Ich verstehe, dass, um einen Artikel in den Vektor einzufügen ich Bedarf dynamisch Speicher zuweisen zu
Ihr Verständnis ist falsch. In dem von Ihnen gezeigten Beispiel enthält Ihr Vektor Zeiger auf Tree
Objekte. Sie müssen die Objekte Tree
nicht dynamisch zuweisen, nur damit sie in den Vektor eingefügt werden können. Sie können einen beliebigen Zeiger auf ein Tree
Objekt in Ihren Vektor einfügen. Es könnte sicher zugeordnet werden, aber es muss nicht sein:
Tree obj;
vec_.push_back(&obj);
Nun kann es andere Gründe, warum Sie würde nicht wollen, dies zu tun, das ist wahr.
Sie können das gleiche Objekt in den Vektor mehr als einmal drücken:
Tree *obj=new Tree();
vec_.push_back(obj);
vec_.push_back(obj);
Alles, was vec_
ist, ist ein Vektor von Zeigern auf Tree
s. Das ist es. Nichts mehr. Nichts anderes. Woher diese Zeiger kommen, interessiert Ihre vec_
nicht. Es geht sie nichts an.
Nun, zurück zum Thema des Löschens Ihrer Tree
s. Das erste, was müssen Sie verstehen, dass, wenn Sie immer noch die ursprünglichen obj
Zeiger haben, dann nur, weil Sie ein tatest
delete obj;
Das bedeutet nicht, dass der Zeiger auf das gleiche Objekt, in Ihrem vec_
magisch verschwunden. Es wird immer noch da sein. Und wenn Sie versuchen, es zu verwenden und es zu dereferenzieren, führt dies zu undefiniertem Verhalten, was normalerweise ein Absturz ist. Willkommen in C++.
Nun, vielleicht nachdem Sie den obigen Absatz ein paar Mal gelesen haben, könnten Sie in der Lage sein, die Antwort auf Ihre letzte Frage herauszufinden, wie Sie das Objekt freigeben, wenn Sie nicht die temporäre obj
Zeiger, bevor es verwendet wurde zurück in das vec_
Array geschoben.
Es ist wahr, dass Sie das Objekt löschen müssen, das Sie zugewiesen haben, aber Sie brauchen den ursprünglichen Zeiger dafür nicht. Zum Beispiel könnte Ihre so genannte "Methode 1" lauten:
Tree *obj=new Tree();
vec_.push_back(obj);
delete vec_.back(); // Instead of delete obj;
vec_.pop_back();
Sie haben den Zeiger auf das Objekt auf der Rückseite Ihres Vektors gedrückt. Um es zu löschen, nehmen Sie den Zeiger auf der Rückseite Ihres Vektors, der das gleiche Objekt ist, das Sie zugewiesen haben, und Sie löschen es. Und um sicherzustellen, dass Ihr Vektor keinen ungültigen Zeiger mehr enthält, auf ein gelöschtes Objekt, geben Sie pop_back()
ein.
Also, was würden Sie für Ihre so genannte "Methode 2" tun ?. Würdest du genau dasselbe glauben?
vec_.push_back(new Tree());
delete vec_.back();
vec_.pop_back();
Wenn Sie es zuordnen und es in einer Liste, die nicht bedeutet, dass Sie aus dem Haken von der Aufhebung der Zuordnung später. Sie müssen sich durch diese Liste drehen und jedes Element löschen. – tadman
Ihr Ausdruck funktioniert nur, wenn Ihre Baumklasse << operator << eine Zeichenfolge implementiert hat. – pkacprzak
Sie sollten den Wert innerhalb des Baumes wie, cout << * (vec_ [i]) drucken. Id << endl; Löschen löschen vec_ [i]; – lobo