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.

¿Por qué el ciclo for en un vector de unique_ptr requiere delete predeterminado?

Estoy trabajando en vs2019 y el siguiente código funcionó correctamente:

std::vector<foo*> foos;
// llena el vector
for (Foo* foo : foos) {
  //hacer algo
}

Sin embargo, si intento usar unique_ptr de esta manera:

std::vector<><foo>> foos;
// llena el vector
for (std::unique_ptr<foo> foo : foos) {
  //hacer algo
}

tanto vs como el compilador están quejándose (si entiendo correctamente) de que Foo no tiene un borrar predeterminado. Pero std::unique_ptr<foo> se utiliza sin problemas en otras partes del código.

¿Por qué está ocurriendo esto y cómo solucionarlo/eludirlo?</foo*>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que std::unique_ptr requiere que el tipo de su parámetro de plantilla tenga un destructor bien definido. Si Foo no tiene un destructor por defecto, o uno que no es accesible para el código de unique_ptr, entonces obtendrás un error o advertencia del compilador.

    Para solucionar este problema, puedes definir una función de eliminación personalizada para unique_ptr que coincida con la forma en que asignaste memoria para los objetos Foo.

    Por ejemplo, si usaste new para asignar memoria a los Foo en tu vector, podrías usar una función de eliminación personalizada como esta:

    std::vector<><foo>> foos;
    // llena el vector
    for (std::unique_ptr<foo>& foo : foos) {
      // hacer cosas
    }
    
    auto customDeleter = [](Foo* foo) { delete foo; };
    std::unique_ptr<foo, decltype(customdeleter)=""> ptr(new Foo(), customDeleter);
    

    Alternativamente, podrías hacer que Foo tenga un destructor por defecto o hacerlo una clase con un destructor público, pero eso no siempre es posible.

    En resumen, para usar unique_ptr con un Foo que no tiene un destructor por defecto, necesitas definir una función de eliminación personalizada o hacer que Foo tenga un destructor público.</foo,>

Comments are closed.