es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El destructor de C++ destruye objetos varias veces.

Soy nuevo en C++ y tengo una pregunta.

Aquí está el código de C++:

class Test
{
public:
    std::string name;
    Test(){};
    Test(std::string name) {

        std::cout << "Crear " << name << '\n';
        Test::name = name;
    };
    ~Test() {std::cout << "Destruir " << name << '\n';} 
};

std::vector<test> test {Test("one"), Test("two"), Test("three")};

void main()
{
    for (auto i : test)
        std::cout << i.name << '\n';

    std::cout << "Limpiar\n";
    test.clear();
}

Y este es el resultado:

Crear one
Crear two
Crear three
Destruir three
Destruir two
Destruir one
one
Destruir one
two
Destruir two
three
Destruir three
Limpiar
Destruir one
Destruir two
Destruir three

¿Por qué el compilador destruye los objetos en el vector varias veces, cuando debería hacerlo solo una vez? ¿Qué hay de malo en ese código?

Compilar Microsoft cl.exe x64 con opciones predeterminadas.

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que los objetos en el vector se copian al iterar a través del vector en el bucle for. Esto crea copias temporales que también se destruyen al final del bucle. Esto resulta en que el destructor se llame varias veces para el mismo objeto.

    Para solucionar este problema, puedes usar un bucle for basado en un rango con una referencia para evitar crear copias temporales:

    for (auto& i : test)
        std::cout << i.name << '\n';
    

    Esto asegurará que el destructor se llame solo una vez para cada objeto en el vector.

    Alternativamente, también puedes usar un bucle for regular con un índice:

    for (int i = 0; i < test.size(); i++)
        std::cout << test[i].name << '\n';
    

    Esto evita crear copias temporales y también garantiza que el destructor se llame solo una vez para cada objeto en el vector.

    En general, el problema está en cómo se copian los objetos al iterar a través del vector, y usar una referencia o un índice puede ayudar a evitar este problema.

Comments are closed.