关于Lambda捕获局部变量延长其生命周期的代码示例问询
Lambda捕获局部变量并延后执行的代码示例
你提到的描述可以通过代码直观体现,下面以C++为例展示这个过程:
#include <iostream> #include <functional> // 返回一个捕获了局部变量的Lambda std::function<void()> getDelayedExecutor() { int local_num = 100; // 这个局部变量的作用域仅限于当前函数 // 值捕获local_num,Lambda会保存该变量的副本 return [local_num]() { std::cout << "延后执行时访问的局部变量值:" << local_num << std::endl; }; } int main() { // 获取Lambda,此时getDelayedExecutor已执行完毕,local_num本应被销毁 auto delayed_func = getDelayedExecutor(); // 延后执行Lambda,此时依然能访问捕获的变量 delayed_func(); return 0; }
代码说明
local_num是getDelayedExecutor函数内的局部变量,按照常规逻辑,函数执行结束后该变量会被销毁。- 但Lambda通过值捕获的方式保存了
local_num的副本,这个副本会被包含在Lambda对象中,随Lambda一起被返回并存储在main函数的delayed_func里。 - 当在
main中调用delayed_func时,虽然原local_num已经不存在,但Lambda里的副本依然有效,实现了代码的延后执行。
注意事项
如果使用引用捕获([&local_num]),会导致悬垂引用问题——因为原局部变量已经销毁,Lambda引用的是一块已释放的内存,访问时会触发未定义行为,这种场景下值捕获才是安全的选择。
内容的提问来源于stack exchange,提问作者Ken Kiarie
相关产品推荐
相关产品推荐

