Pregunta

Mira este código:

class test
{
    public:
        test() { cout << "Constructor" << endl; };
        virtual ~test() { cout << "Destructor" << endl; };
};

int main(int argc, char* argv[])
{
    test* t = new test();
    delete(t);
    list<test*> l;
    l.push_back(DNEW test());
    cout << l.size() << endl;
    l.clear();
    cout << l.size() << endl;
}

Y luego, mira esta salida:

    Constructor
    Destructor
    Contructor
    1
    0

La pregunta es:¿Por qué es el destructor del elemento de la lista no se llama en l.clear()?

¿Fue útil?

Solución

Su lista de punteros.Los punteros no tiene destructores.Si desea que el destructor se llama usted debe tratar de list<test> en su lugar.

Otros consejos

Una mejor alternativa para liberar el uso de punteros delete, o el uso de algo que los resúmenes de distancia (tales como punteros inteligentes o puntero de contenedores), es simplemente crear los objetos directamente en la pila.

Se debe preferir test t; más test * t = new test(); Muy rara vez quieren tratar con cualquier puntero que posee un recurso, inteligente o de otra manera.

Si usted fuera a utilizar una std::list de lo 'real' de los elementos, en lugar de punteros a los elementos, no tendría este problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top