在lambda函数中何时释放变量副本?



如下例所示,我定义了两个变量x和y。当我两次调用lambda函数时,它似乎不会破坏副本。从11.14 - Lambda捕获| Learn c++ - Learn c++,它说:

因为捕获的变量是lambda对象的成员,它们的值在对lambda的多次调用中持久化!

c++如何管理lambda函数的内存?

int main() {
int x = 1;
static int y = 1;
auto fun = [=]() mutable{
x++;
y++;
cout<<"Inside:tt";
cout<<"x:"<<x<<"t"<<"y:"<<y<<endl;
};
for (int i = 0; i<2; i++) {
fun();
cout<<"Outside:t";
cout<<"x:"<<x<<"t"<<"y:"<<y<<endl<<endl;
}
}

输出:

Inside:         x:2     y:2
Outside:        x:1     y:2
Inside:         x:3     y:3
Outside:        x:1     y:3

它将其存储在对象本身中。另一种考虑的方法如下。这是"有点"。等价于编译器生成的内容,是的,我正在改变作用域,我知道这一点,但对于c++初学者来说,这可能更清楚。

static int y = 1; // Moved this out from main
class my_lambda{
public:
my_lambda(int x) : _x(x) {}
~my_lambda() = default;
void operator()()
{
_x++;
y++;
cout<<"Inside:tt";
cout<<"_x:"<<_x<<"t"<<"y:"<<y<<endl;
}
private:
int _x;
};
int main() {
int x = 1;
my_lambda fun{x}; // "Captures" x
for (int i = 0; i<2; i++) {
fun();
cout<<"Outside:t";
cout<<"x:"<<x<<"t"<<"y:"<<y<<endl<<endl;
}
}

正如你所看到的,"冒牌lambda"类所做的事情和实际的是一样的。它"captures"x作为其构造函数的一部分,并将其复制到内部存储器,我称之为_x。y正好在它的作用域中,尽管我将全局移到类声明之上。

我重载()操作符使一个类是可调用的,这是一个正常的事情在某些情况下做。如果您想了解更多信息,请参见操作符重载。

这是"kind, sort "如何工作。它们将你的身体放入生成的对象的operator()中,捕获的任何东西都是对象的变量之一,如果以这种方式捕获,则具有实际对象(如果按值)或引用。

直接回答你的问题:当fun超出作用域时,它被释放,无论是在lambda中,还是在我的情况下。

最新更新