c++ - transitorio - ¿Tengo que borrar las lambdas?
modelo transitorio odoo (2)
Estoy almacenando punteros a lambdas en objetos asignados dinámicamente:
struct Function {
SomeType*(*func)(int);
Function(SomeType*(*new_func)(int)):
func(new_func) {}
}
Function* myf = new Function(
[](int x){ return doSomething(x); }
);
delete myf;
¿Tengo que escribir algo especial en el destructor de esta clase?
No, no necesitas hacer nada especial. En este caso (está convirtiendo el lambda en un puntero de función) esto no es diferente de decirle que tampoco necesita eliminar doSomething
.
Más generalmente, las lambdas son tipos sin nombre con constructores predeterminados eliminados. Esto significa que solo puede crear una explícitamente con una nueva expresión al copiarla / moverla, y solo entonces tendrá que llamar a delete
.
N4140 §5.1.2 [expr.prim.lambda] / 20
El tipo de cierre asociado con una expresión lambda tiene un constructor predeterminado eliminado y un operador de asignación de copia eliminada.
Sin saber qué se supone que debe hacer tu clase, es imposible decirte qué debe o no debe hacer su destructor.
Si la clase asigna directamente memoria dinámica (con new
o malloc
[no use malloc
]), entonces debería considerar cómo desasignar esa memoria. Del mismo modo, si la clase adquiere otros recursos, como los punteros a archivos, deberá considerar cómo liberar esos recursos. Típicamente, el lugar adecuado para hacerlo es el destructor.
Pregúntese: ¿La clase asigna directamente alguna memoria dinámica o adquiere recursos externos? La respuesta parece ser: No, no es así. Así que parece que no hay nada en particular que deba hacerse explícitamente en el cuerpo del destructor.