c++lambda传引用导致该值乱码
时间: 2023-10-16 21:26:52 浏览: 41
如果你在lambda函数中传递了一个引用,并且在lambda函数执行完后,被引用的对象已经超出了其作用域,那么该引用将成为一个悬垂引用,其行为是未定义的,可能会导致乱码的问题。
例如,以下代码中的lambda函数尝试通过引用传递变量`str`:
```
#include <iostream>
#include <string>
int main()
{
std::string str = "hello";
auto lambda = [&str]() {
std::cout << str << std::endl;
};
lambda();
str = "world";
lambda();
return 0;
}
```
输出结果应该是:
```
hello
world
```
但是,如果你将`lambda`函数保存到一个全局变量中,那么当`str`超出其作用域时,`lambda`函数将引用一个已经被销毁的对象,导致未定义的行为。
例如,以下代码:
```
#include <iostream>
#include <string>
std::function<void()> global_lambda;
void setup_lambda(const std::string& str)
{
global_lambda = [&str]() {
std::cout << str << std::endl;
};
}
int main()
{
setup_lambda("hello");
global_lambda();
return 0;
}
```
输出结果可能是乱码,因为`global_lambda`引用了一个已经被销毁的对象。为了避免这种情况,你可以将参数传递给lambda函数,而不是通过引用访问外部变量。