卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章76387本站已运行4321

C++ lambda 表达式与闭包:内存管理与所有权

c++++ lambda 表达式是动态创建的匿名函数对象。捕获外部变量,即闭包时,内存由编译器管理,使用共享所有权语义:按引用捕获变量,lambda 和原始变量共享所有权。按值捕获变量,lambda 拥有捕获变量的副本。lambda 表达式作为参数传递或返回时,所有权也随之传递或返回。

C++ lambda 表达式与闭包:内存管理与所有权

C++ lambda 表达式与闭包:内存管理与所有权

lambda 表达式是在运行时动态创建的匿名函数对象。它们提供了简洁的方法来创建内联函数,无需显式定义单独的函数。在 C++ 中,lambda 表达式可以捕获外部变量,这被称为闭包。

内存管理

立即学习“C++免费学习笔记(深入)”;

当 lambda 表达式捕获外部变量时,编译器会为 lambda 对象分配内存并初始化捕获的变量。内存由编译器自动管理,使用共享所有权语义。这意味着 lambda 对象的所有副本都共享对捕获变量的引用。

所有权规则

以下是 C++ lambda 表达式所有权的规则:

  • 如果捕获的变量是按引用捕获的(使用 [ 符号),则 lambda 表达式与原始变量共享所有权。
  • 如果捕获的变量是按值捕获的(使用 [ 符号),则 lambda 表达式拥有捕获变量的副本。
  • 如果 lambda 表达式被作为函数参数传递或返回,则 lambda 表达式的所有权也会被传递或返回。

实战案例

以下代码段演示了 C++ 中 lambda 表达式如何捕获和使用外部变量:

int main() {
    int x = 5;

    // 按引用捕获外部变量
    auto lambda1 = [x](int y) { return x + y; };
    std::cout << lambda1(10) << std::endl; // 输出:15

    // 按值捕获外部变量
    auto lambda2 = [x](int y) { return x * y; };
    std::cout << lambda2(10) << std::endl; // 输出:50

    return 0;
}

在第一个 lambda 表达式中,x 是按引用捕获的,因此 lambda 表达式与原始变量共享相同的所有权。而在第二个 lambda 表达式中,x 是按值捕获的,因此 lambda 表达式拥有捕获变量的副本。

卓越飞翔博客
上一篇: C++ 函数调用约定如何处理参数传递?
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏