2016-10-30 5 views
20

Я хранение указателей на лямбды в динамически выделенных объектах:Нужно ли мне удалять лямбды?

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

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

delete myf; 

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

+10

Одно замечание - почему бы не использовать 'unique_ptr' или' shared_ptr' вместо 'new' и' delete'? –

+1

Почему вы думаете, что вам, возможно, придется написать что-то особенное в деструкторе? – user2079303

+0

просто факт, что что-то является указателем, не означает, что вам нужно его удалить. –

ответ

13

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

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

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

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

+0

Что делать, если я сам сохраню объект лямбда, а не преобразовываю его в указатель на функцию? https://pastebin.com/GJCkKjxY – Alexander

4

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

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

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