2010-08-29 12 views
6

Hier ist der Code (auch bei http://pastebin.com/yw5z2hnG):C++ Zu viele Destruktoren aufgerufen so wenige Objekte

#include <iostream> 
#include <vector> 
using namespace std; 

class X 
{ 
    public: 
    int i; 
    X(); 
    ~X(); 
}; 

X::X() 
{ 
    i = 1; 
    cout << "---constructor" << '\n'; 
} 

X::~X() 
{ 
    cout << "***desctructor" << '\n'; 
} 

int main() 
{ 
    vector<X> *vx = new vector<X>; 
    cout << "------------------------------------" << endl; 
    vx->push_back(X()); 
    vx->push_back(X()); 
    vx->push_back(X()); 
    vx->push_back(X()); 
    vx->push_back(X()); 
    cout << "------------------------------------" << endl; 
    delete vx; 
} 

ich die Ausgabe erhalten, wie:

------------------------------------ 
---constructor 
***desctructor 
---constructor 
***desctructor 
***desctructor 
---constructor 
***desctructor 
***desctructor 
***desctructor 
---constructor 
***desctructor 
---constructor 
***desctructor 
***desctructor 
***desctructor 
***desctructor 
***desctructor 
------------------------------------ 
***desctructor 
***desctructor 
***desctructor 
***desctructor 
***desctructor 

Ich verstehe nicht, warum so viele Destruktoren sind namens.

+1

Es ist ein Duplikat viele Male vorbei ... aber ich kann sie nicht finden Denn Leute, die diese Frage stellen, wissen normalerweise nichts über implizit definierte Kopierkonstrukteure: p Ich finde es immer lustig, dass Ignoranz einen am Lernen hindern kann, weil er eine effiziente Abfrage verhindert. –

Antwort

14

Wenn Sie eine eigene Copykonstruktor definieren Sie die anderen Objekte sehen konstruiert werden:

class X 
{ 
    public: 
    int i; 
    X(const X&); 
    X(); 
    ~X(); 
}; 

X::X(const X& x) : i(x.i) 
{ 
    cout << "---copy constructor\n"; 
} 

// ... rest as before 

Der Compiler einen Kopierkonstruktor bieten wird, die keine Protokollierung durchführt, wenn Sie nicht Ihr eigenes erklären.

+0

+1: Implizite Kopien sind die Ursache. – Puppy

1

Ein weiteres Detail - wenn Sie reservieren Platz für Ihre Vektor im Voraus:

int main() 
{ 
    vector<X> *vx = new vector<X>; 
    vx->reserve(5); 
    .... 

Dann werden Sie die folgende Ausgabe:

---constructor 
+++ copy constructor 
***desctructor 
---constructor 
+++ copy constructor 
***desctructor 
... 

So wie Sie alle Vektor auch Kopien sehen seine Elemente, wenn es benötigt wird, um seinen Speicher neu zu ordnen - deshalb erhalten Sie 5 Kopie Konstruktoren und Destruktoren für die letzten push_back()

+0

Ihre Antwort hat sehr geholfen. Ich reserviere jetzt wo immer möglich, nicht nur Vektoren. Mein Programm läuft viel schneller. Vielen Dank! – Xolve

Verwandte Themen