Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我必须删除lambdas吗?_C++_C++11_Lambda_Function Pointers_Destructor - Fatal编程技术网

C++ 我必须删除lambdas吗?

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; 我必须在这个类的析构函数中写一些特殊的东西吗?

我在动态分配的对象中存储指向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;

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

不,你不需要做任何特殊的事情。在这种情况下(将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对象本身,而不是将其转换为函数指针?