我必须删除lambdas吗?

时间:2016-10-30 16:32:31

标签: c++ c++11 lambda function-pointers destructor

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

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

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

delete myf;

我是否必须在此类的析构函数中编写特殊内容?

2 个答案:

答案 0 :(得分:13)

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

更一般地说,lambdas是具有已删除默认构造函数的未命名类型。这意味着您只能通过复制/移动构建它来显式创建一个具有新表达式的表达式 - 只有这样您才需要调用delete

  

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

     

lambda-expression 关联的闭包类型已删除   默认构造函数和已删除的复制赋值运算符。

答案 1 :(得分:4)

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

如果类直接分配动态内存(使用newmalloc [不使用malloc]),那么您必须考虑如何释放该内存。同样,如果类获取其他资源(如文件指针),则必须考虑如何释放这些资源。通常,这样做的适当位置是析构函数。

问问自己:该类是直接分配任何动态内存还是获取外部资源?答案似乎是:不,它没有。因此,似乎没有任何特别的东西应该在析构函数的主体中明确地完成。