C ++ lambda,std :: function内存管理

时间:2016-09-30 04:52:39

标签: c++ memory-management lambda std-function

我有一些问题

  1. C ++ lambda代码和捕获变量的内存位置在哪里?

  2. 当lambda的记忆是免费的吗? (条件)

  3. “std :: function :: operator =()”复制代码或代码的指针?

  4. 是否有std :: function的深拷贝方法?

1 个答案:

答案 0 :(得分:1)

Lambda表达式只是创建临时功能对象(并定义其对应的类)的便捷简写。该对象仅包含捕获的值作为其直接数据成员。在这方面,lambdas并没有真正在语言中引入任何新的东西。

如果您明确声明该类并手动创建该临时功能对象,则lambda对象的生命周期将相同。它的“记忆”位于任何其他临时存储器所在的位置。语言确实定义了它的位置。这些对象按照相同的规则被销毁,所有其他临时对象都被销毁,即它们在完整表达结束时自动销毁(除了临时扩展的生命周期延长的特殊情况)。

在C ++中没有“复制代码”的概念。 std::function对象只是使用特定于实现的技术来存储初始化的函子(函数对象,包括lambdas,常规函数指针,成员函数指针)以及一些未指定的类型擦除技术。没有必要为此复制“代码”。

目前尚不清楚prev对象的“深层复制”是什么意思。该类的接口规范没有规定深度和浅层复制之间的任何区别。