我必须删除 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 直接分配动态内存(使用 new
或 malloc
[不要使用 malloc
]),那么您将不得不考虑如何释放该内存。同样,如果 class 获取了文件指针等其他资源,您将不得不考虑如何释放这些资源。通常,合适的地方是析构函数。
问问自己:class是否直接分配任何动态内存或获取外部资源?答案似乎是:不,不是。所以似乎没有什么特别的东西应该在析构函数的主体中显式完成。
我在动态分配的对象中存储指向 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 直接分配动态内存(使用 new
或 malloc
[不要使用 malloc
]),那么您将不得不考虑如何释放该内存。同样,如果 class 获取了文件指针等其他资源,您将不得不考虑如何释放这些资源。通常,合适的地方是析构函数。
问问自己:class是否直接分配任何动态内存或获取外部资源?答案似乎是:不,不是。所以似乎没有什么特别的东西应该在析构函数的主体中显式完成。