我必须删除 lambda 吗?

Do I have to delete lambdas?

我在动态分配的对象中存储指向 lambda 的指针:

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

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

delete myf;

我是否必须在这个 class 的析构函数中写一些特殊的东西?

不,您不需要做任何特别的事情。在这种情况下(您将 lambda 转换为函数指针)这与告诉您您也不需要删除 doSomething 没有什么不同。

更一般地说,lambda 是具有删除的默认构造函数的未命名类型。这意味着您只能通过 copy/move 构造它来显式创建一个带有新表达式的表达式 - 只有这样您才必须调用 delete.

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

The closure type associated with a lambda-expression has a deleted default constructor and a deleted copy assignment operator.

不知道你的 class 应该做什么,就不可能告诉你它的析构函数应该做什么或不应该做什么。

如果 class 直接分配动态内存(使用 newmalloc [不要使用 malloc]),那么您将不得不考虑如何释放该内存。同样,如果 class 获取了文件指针等其他资源,您将不得不考虑如何释放这些资源。通常,合适的地方是析构函数。

问问自己:class是否直接分配任何动态内存或获取外部资源?答案似乎是:不,不是。所以似乎没有什么特别的东西应该在析构函数的主体中显式完成。