Подтвердить что ты не робот

Нужно ли мне удалять лямбды?

Я сохраняю указатели на лямбда в динамически выделенных объектах:

struct Function {
    SomeType*(*func)(int);
    Function(SomeType*(*new_func)(int)):
        func(new_func) {}
}

Function* myf = new Function(
    [](int x){ return doSomething(x); }
);

delete myf;

Должен ли я написать что-то особенное в деструкторе этого класса?

4b9b3361

Ответ 1

Нет, вам не нужно ничего особенного делать. В этом случае (вы преобразовываете лямбда в указатель функции) это ничем не отличается от того, что вам не нужно удалять doSomething.

В более общем плане, lambdas являются неназванными типами с удаленными конструкторами по умолчанию. Это означает, что вы можете явно создать одно с новым выражением, скопировав/переместив его, и только тогда вам придется называть delete.

N4140 §5.1.2 [expr.prim.lambda]/20

Тип замыкания, связанный с лямбда-выражением, удаляется конструктор по умолчанию и оператор назначения удаленной копии.

Ответ 2

Не зная, что должен делать ваш класс, невозможно сказать, что его деструктор должен или не должен делать.

Если класс напрямую выделяет динамическую память (с помощью new или malloc [не использовать malloc]), вам придется подумать о том, как освободить эту память. Аналогично, если класс приобретает другие ресурсы, такие как указатели файлов, вам придется подумать о том, как выпустить эти ресурсы. Как правило, подходящим местом для этого является деструктор.

Спросите себя: распределяет ли класс динамическую память или использует внешние ресурсы? Ответ выглядит следующим образом: Нет, это не так. Таким образом, похоже, в частности, ничего не должно быть сделано в теле деструктора.