我在动态分配的对象中存储指向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;
我是否必须在此类的析构函数中编写特殊内容?
答案 0 :(得分:13)
不,你不需要做任何特别的事情。在这种情况下(您将lambda转换为函数指针),告诉您不需要删除doSomething
也没有什么不同。
更一般地说,lambdas是具有已删除默认构造函数的未命名类型。这意味着您只能通过复制/移动构建它来显式创建一个具有新表达式的表达式 - 只有这样您才需要调用delete
。
N4140§5.1.2[expr.prim.lambda] / 20
与 lambda-expression 关联的闭包类型已删除 默认构造函数和已删除的复制赋值运算符。
答案 1 :(得分:4)
如果不知道你的课程应该做什么,就不可能告诉你它的析构函数应该或不应该做什么。
如果类直接分配动态内存(使用new
或malloc
[不使用malloc
]),那么您必须考虑如何释放该内存。同样,如果类获取其他资源(如文件指针),则必须考虑如何释放这些资源。通常,这样做的适当位置是析构函数。
问问自己:该类是直接分配任何动态内存还是获取外部资源?答案似乎是:不,它没有。因此,似乎没有任何特别的东西应该在析构函数的主体中明确地完成。