¿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*>
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. SiFoo
no tiene un destructor por defecto, o uno que no es accesible para el código deunique_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 objetosFoo
.Por ejemplo, si usaste
new
para asignar memoria a losFoo
en tu vector, podrías usar una función de eliminación personalizada como esta: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 unFoo
que no tiene un destructor por defecto, necesitas definir una función de eliminación personalizada o hacer queFoo
tenga un destructor público.</foo,>