C++ 如果我使用std::函数捕获lambda,我应该担心它被释放吗?

C++ 如果我使用std::函数捕获lambda,我应该担心它被释放吗?,c++,c++11,memory-management,lambda,C++,C++11,Memory Management,Lambda,考虑以下代码 std::function<void(void)> f = []() {}; std::function<void(void)>* fp = new std::function<void(void)>(f); std::函数f=[](){}; std::function*fp=新的std::function(f); 每当程序离开这些行的上下文时(假设它们在函数中被调用,函数返回)f和fp的内存可能会在某个时候被回收。这很好,因为我只对fp感兴

考虑以下代码

std::function<void(void)> f = []() {};
std::function<void(void)>* fp = new std::function<void(void)>(f);
std::函数f=[](){};
std::function*fp=新的std::function(f);
每当程序离开这些行的上下文时(假设它们在函数中被调用,函数返回)
f
fp
的内存可能会在某个时候被回收。这很好,因为我只对
fp
感兴趣,我得到了一份

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

f
是否会被解除分配,导致
fp
无效?

声明:

std::function<void(void)>* fp = new std::function<void(void)>(f);
std::function*fp=新的std::function(f);
调用复制构造函数
函数(std::function const&)
并且
f
存储在
fp
指向的内存中

因此,
fp
不会失效,除非将其删除


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

情况与
int x=1相同;int*xp=新的int(x)。另一个问题是,为什么不能将函数存储在其生命周期与其使用重叠的位置。
std::function
已经是指向函数对象的智能指针。@Oliv这不是这样的事情。如果有的话,它将函数对象作为成员保存。@rubenvb您可以在
std::function
中保存任意大小的函数对象,因此它不能(始终)是直接成员。请记住,“智能指针”包括唯一所有权