2010-08-29 11 views
6

Aquí está el código (también en http://pastebin.com/yw5z2hnG):C++ Demasiados destructores llamados tan pocos objetos

#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; 
} 

consigo la salida como:

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

no entiendo por qué tantos destructores son llamado.

+1

Es un duplicado muchas veces ... pero no puedo encontrarlos porque la gente que hace esta pregunta generalmente no sabe acerca de los constructores de copia implícitamente definidos: p Siempre me resulta gracioso que la ignorancia impida que uno aprenda, ya que evita que se realice una consulta de manera eficiente. –

Respuesta

14

Si define su propio constructor de copia, verá los demás objetos que están siendo construidos:

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 

El compilador proporcionará un constructor de copia que realiza ningún registro si no declara su propia.

+0

+1: las copias implícitas son la causa. – Puppy

1

Un detalle más - si reserva espacio para su vector de antemano:

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

entonces obtendrá el siguiente resultado:

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

Así como se puede ver también vector copias en todo sus elementos cuando es necesario reasignar su almacenamiento - es por eso que obtiene 5 constructores de copia y destructores para el último push_back()

+0

Tu respuesta ayudó mucho. Ahora reservo espacio siempre que sea posible, no solo vectores. Mi programa se ejecuta mucho más rápido. ¡Gracias! – Xolve

Cuestiones relacionadas