2016-04-07 12 views
1

Ich versuche Artikel zu drucken, die in einem Vektor gespeichert sind, die eine Instanz einer Klasse zum Beispiel enthält:Ausdruck Elemente in einem dynamischen Array

vector<Tree *> vec_; 

Ich verstehe, dass, um ein Element einzufügen in den Vektor kann ich zuzuteilen dynamisch Speicher einen Baumobjekt in den Vektor zum Beispiel ein:

Methode 1:

Tree * obj = new Tree(); 
vec_.push_back(obj); 

Methode 2:

vec_.push_back(new Tree()); 

First off ich wissen will, wie für Methode 2 dynamisch zugewiesenen Speicher zu löschen, weil ich verstehe, dass für Methode 1, ich möchte etwas tun:

delete obj; 

Schließlich Probleme Ich habe den Ausdruck Artikel in unserem Vektor, erhalte ich einen Fehler, der besagt, dass ungültige Operanden dort binären Ausdruck ist (ich bin nicht sicher, was das bedeutet) Das ist, was ich versucht habe:

vec_.push_back(obj); //this is just to show that the vector is populated. (pseudo) 
vec_.push_back(obj1); 
vec_.push_back(obj2); 
vec_.push_back(obj3); 
for(int i = 0; i < vec_.size();i++) 
    cout << *(vec_[i]) << endl; 
+0

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

+1

Ihr Ausdruck funktioniert nur, wenn Ihre Baumklasse << operator << eine Zeichenfolge implementiert hat. – pkacprzak

+0

Sie sollten den Wert innerhalb des Baumes wie, cout << * (vec_ [i]) drucken. Id << endl; Löschen löschen vec_ [i]; – lobo

Antwort

0

löschen dynamisch Speicher für Methode zugewiesen 2:

Tree *obj = vec_.back(); 
vec_.pop_back(); 
delete obj; 
obj = NULL; 
+0

gibt es eine effizientere Methode? In Bezug auf die Ausführungszeit – Bthegreatest

+0

@Bthegreatest - effizienter in Bezug auf was? Ausführungszeit oder Zeilen von Quellcode oder ausführbarer Größe. Vielleicht etwas ganz anderes !? – enhzflep

0

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(); 
Verwandte Themen