C++ 我必须删除lambdas吗?
我在动态分配的对象中存储指向lambda的指针:C++ 我必须删除lambdas吗?,c++,c++11,lambda,function-pointers,destructor,C++,C++11,Lambda,Function Pointers,Destructor,我在动态分配的对象中存储指向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; 我必须在这个类的析构函数中写一些特殊的东西吗?
struct Function {
SomeType*(*func)(int);
Function(SomeType*(*new_func)(int)):
func(new_func) {}
}
Function* myf = new Function(
[](int x){ return doSomething(x); }
);
delete myf;
我必须在这个类的析构函数中写一些特殊的东西吗?不,你不需要做任何特殊的事情。在这种情况下(将lambda转换为函数指针),这与告诉您也不需要删除
doSomething
没有什么不同
更一般地说,lambda是带有已删除默认构造函数的未命名类型。这意味着您只能通过复制/移动构造新表达式来显式地创建一个表达式,只有这样您才能调用delete
N4140§5.1.2【解释原始lambda】/20
与lambda表达式关联的闭包类型具有已删除的
默认构造函数和已删除的复制分配运算符
如果不知道类应该做什么,就不可能告诉您它的析构函数应该做什么或不应该做什么
如果类直接分配动态内存(用<代码>新< /代码>或<代码> MalOC > [不要使用<代码> MALOC >),那么您就必须考虑如何释放内存。同样,如果类获取其他资源(如文件指针),则必须考虑如何释放这些资源。通常,执行此操作的正确位置是析构函数
扪心自问:这个类是否直接分配动态内存或获取外部资源?答案似乎是:不,不是。因此,在析构函数的主体中似乎没有什么特别需要明确执行的操作。一句话-为什么不使用
unique\u ptr
或shared\u ptr
而不是new
和delete
?为什么你认为你可能必须在析构函数中编写一些特殊的东西?警告:只有无状态lambda可以转换为函数指针。使用std::function
而不是原始函数指针将允许任何具有正确参数和结果类型的函子。@hvd stateless意味着它们不会捕获[]
字段中的任何内容,对吗?我的将是固定类型,但感谢您对std::function
@user6245072的建议是的,这就是我的意思。为了完整起见,无状态可能是一个错误的词,一个lambda有一个通用的[&]
或[=]
捕获列表,但恰好没有捕获任何内容,从技术上讲也是无状态的,但仍然无法转换为函数指针。如果我保存lambda对象本身,而不是将其转换为函数指针?