如果我使用std :: function捕获lambda,我是否担心它会被释放?

时间:2019-01-22 08:12:10

标签: c++ c++11 memory-management lambda

考虑以下代码,

std::function<void(void)> f = []() {};
std::function<void(void)>* fp = new std::function<void(void)>(f);

每当程序离开这些行的上下文时(例如,它们在函数内部被调用并且函数返回),ffp的内存可能会在某个时候被回收。很好,因为我只对fp感兴趣,并且得到了它的副本。

关键是要有一个函数指针(fp),以后我可以随时调用它。因此,只要我不delete fp,问题就是:

f会被释放,从而fp无效吗?

1 个答案:

答案 0 :(得分:4)

声明:

std::function<void(void)>* fp = new std::function<void(void)>(f);

调用复制构造函数function(std::function<void ()> const&)f存储在fp指向的内存中。

因此fp除非被删除,否则不会失效。

如注释中所指出的,它与在使用new分配内存的另一个变量的初始化中使用的任何其他局部变量相同。除非删除指针本身,否则局部变量的寿命不会影响指针变量的后续使用。