2017-07-11 1 views
-2

Ich habe diesen Code.Die Ausgabe ist: ~ A ~ A ~ AprintA ~ AprintA ~ AprintA ~ A. Ich verstehe, warum es printA ~ AprintA ~ AprintA ~ A druckt (weil ich 3 push_back habe), aber ich verstehe nicht, warum "~ A" 3 mal am Anfang des Satzes erscheint.Wenn ich nur v.push_back(a); habe (nur das, ohne die anderen 2 Pushbacks, "~ A", wird nicht erscheinen, warum?Print Destructor in C++

#include<vector> 
#include<iostream> 
    class A { 
    public: 
     virtual void print() { 
      std::cout << "printA"; 
     } 
     virtual ~A() { 
      std::cout << "~A"; 
     } 
    }; 



int main() { 
    std::vector<A> v; 
    A a; 
    A b; 
    A c; 
    v.push_back(a); 
    v.push_back(b); 
    v.push_back(c); 
    for (auto e : v) 
     e.print(); 

     } 
+0

Reallokation; eine Kopie in der Schleife machen. – LogicStuff

+4

Ihre Frage ist falsch formatiert. Nimm dir einen Moment Zeit, um das zu beheben. – StoryTeller

+1

... auch Ihre Ausgabe Formatierung ist nicht die beste. Wenn Sie ein '" \ n "' nach jedem Cout setzen, wäre es viel einfacher zu lesen – user463035818

Antwort

2

Wenn Sie zurückzudrängen Objekte in den Vektor ist es size() wird zunehmen. Wenn dann genügend Objekte durch push_back() hinzugefügt werden (in diesem Fall wurde nur 1 nach dem ursprünglichen Objekt benötigt) und capacity() < size() + 1 wird wahr, muss der Vektor an Kapazität zunehmen, um mehr Elemente aufnehmen zu können, dies erfordert eine Neuzuweisung und somit Zerstörung und Zerstörung von Objekte, deshalb sehen Sie die Destruktor-Aufrufe.

Versuchen Sie, die Kapazität des Vektors zu erhöhen, bevor durch die Verwendung reserve(new_cap) ihm hinzufügen und Sie werden sehen, dass die destructor Anrufe nicht auftreten:

std::vector<A> v; 
v.reserve(10); 
A a; 
A b; 
A c; 
//etc.. 

Dies trat nicht auf, wenn Sie nur 1 zurückgeschoben Objekt, weil nichts in dem Vektor enthalten war, der neu erstellt werden musste.