C++ 람다 표현식 매개변수 생명 주기

C++에서 람다 표현식은 외부 변수를 캡처하여 그 안에서 사용할 수 있는 편리한 익명 함수입니다. 이는 람다가 유연한 프로그래밍 도구가 되도록 합니다. 하지만 람다 표현식의 매개변수 생명 주기는 특히 캡처 및 전달 시 특별히 주의해야 할 측면입니다.

람다 표현식의 매개변수 생명 주기

람다 표현식의 매개변수 수명은 일반적으로 다른 C++ 함수와 동일합니다. 함수의 매개변수는 함수 호출 시 존재하며, 함수 호출이 종료되면 매개변수 수명이 종료됩니다. 하지만 람다 표현식이 외부 변수를 캡처할 수 있기 때문에 매개변수 수명은 캡처 방식에 영향을 받기도 합니다.

포획과 매개변수 생명 주기의 관계

외부 변수 캡처

C++ 람다 표현식은 외부 변수를 두 가지 방식으로 캡처할 수 있습니다

  • 값 캡처: 값 캡처를 통해 외부 변수의 값이 람다 내부에 복사되고, 람다 내부의 복사본은 람다의 생명주기에 의해 제어됩니다
  • 참조 캡처: 참조 캡처를 통해 외부 변수의 참조가 유지되며, 람다 내부의 참조는 원래 외부 변수를 가리키고, 생명 주기는 외부 변수에 의존합니다
int x = 10;
auto lambda_by_value = [x]() { std::cout << x << std::endl; };  // 捕获x的副本
auto lambda_by_reference = [&x]() { std::cout << x << std::endl; };  // 捕获x的引用

lambda_by_value();  // 打印10
lambda_by_reference();  // 打印10

캡처된 변수의 수명 주기는 다음과 같습니다

  • 값 캡처: 캡처 시 외부 변수의 값이 람다에 복사되고, 람다가 종료될 때 복사된 사본이 파괴됩니다
  • 람다가 외부 변수를 참조할 때, 외부 변수는 람다 사용 전에 유효해야 하며, 그렇지 않으면 정의되지 않은 동작이 발생할 수 있습니다.

람다 매개변수

람다 함수의 매개변수는 일반 함수 매개변수와 유사하며, 그 수명은 람다 함수 내에서만 유효합니다. 즉, 람다 매개변수는 람다 호출 시 생성되고, 람다 호출이 종료되면 매개변수의 수명도 함께 종료됩니다.

auto lambda = [](int a, int b) {
    std::cout << a + b << std::endl;
};
lambda(5, 10);  // a和b在这里是lambda的参数

이 예제에서, ab는 람다 표현식의 매개변수이며, 람다 호출 시 생성되고 람다 실행 종료 후 파괴됩니다

외부 변수 캡처 시 라이프사이클 문제

람다 외부에서 포획된 변수가 유효한지

  • 람다 호출 후 외부 변수가 파괴되더라도 람다는 여전히 외부 변수의 복사본을 보유합니다. 따라서 외부 변수가 더 이상 존재하지 않더라도 람다 내부의 복사본은 안전하게 사용할 수 있습니다.
int x = 10;
auto lambda = [x]() { std::cout << x << std::endl; };
x = 20;  // x 在lambda调用后修改
lambda();  // 打印10,捕获的是x的副本
  • 캡처된 변수가 참조에 의한 캡처인 경우, 람다 내부에서 해당 참조에 대한 접근은 외부 변수의 수명 주기(lifetime)에 의존합니다. 만약 외부 변수가 람다가 실행되기 전에 소멸된다면, 댕글링 포인터(dangling reference) 문제가 발생하여 정의되지 않은 동작을 초래할 수 있습니다.
int x = 10;
auto lambda = [&x]() { std::cout << x << std::endl; };
x = 20;  // x 在lambda调用前修改
lambda();  // 打印20,捕获的是x的引用

람다 함수의 실행 순서가 불확실한 경우, 람다가 실행될 때 캡처된 외부 변수가 여전히 유효한지 확인하는 것이 중요합니다

Licensed under CC BY-NC-SA 4.0
마지막 수정: 2025년 05월 25일 14:10
금융 IT 프로그래머의 이것저것 만지작거리기와 일상의 중얼거림
Hugo로 만듦
JimmyStack 테마 사용 중