Нужно ли мне удалять лямбды?
Я сохраняю указатели на лямбда в динамически выделенных объектах:
struct Function {
SomeType*(*func)(int);
Function(SomeType*(*new_func)(int)):
func(new_func) {}
}
Function* myf = new Function(
[](int x){ return doSomething(x); }
);
delete myf;
Должен ли я написать что-то особенное в деструкторе этого класса?
Ответы
Ответ 1
Нет, вам не нужно ничего особенного делать. В этом случае (вы преобразовываете лямбда в указатель функции) это ничем не отличается от того, что вам не нужно удалять doSomething
.
В более общем плане, lambdas являются неназванными типами с удаленными конструкторами по умолчанию. Это означает, что вы можете явно создать одно с новым выражением, скопировав/переместив его, и только тогда вам придется называть delete
.
N4140 §5.1.2 [expr.prim.lambda]/20
Тип замыкания, связанный с лямбда-выражением, удаляется конструктор по умолчанию и оператор назначения удаленной копии.
Ответ 2
Не зная, что должен делать ваш класс, невозможно сказать, что его деструктор должен или не должен делать.
Если класс напрямую выделяет динамическую память (с помощью new
или malloc
[не использовать malloc
]), вам придется подумать о том, как освободить эту память. Аналогично, если класс приобретает другие ресурсы, такие как указатели файлов, вам придется подумать о том, как выпустить эти ресурсы. Как правило, подходящим местом для этого является деструктор.
Спросите себя: распределяет ли класс динамическую память или использует внешние ресурсы? Ответ выглядит следующим образом: Нет, это не так. Таким образом, похоже, в частности, ничего не должно быть сделано в теле деструктора.