【问题标题】:If I use std::function to capture a lambda, should I worry about it being deallocated?如果我使用 std::function 捕获 lambda,我应该担心它被释放吗?
【发布时间】:2019-06-15 15:53:32
【问题描述】:

考虑以下代码,

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

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

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

f 是否会被释放,导致 fp 无效?

【问题讨论】:

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

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


【解决方案1】:

声明:

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

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

所以fp除非被删除,否则不会失效。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    相关资源
    最近更新 更多