隐形类型转换,生成临时变量导致的bug
示例代码
#define GUEST "guest"
void func1() {
return func2(GUEST);
}
void func2(const std::string& guest) {
func3([&](){
std::cout << guest << std::endl;
});
}
代码说明
上面代码func3的参数是lambda函数,func3对这个lambda函数并不会立即调用,而是等到func1返回后一段时间后才调用,即异步调用lambda函数。
现象说明
当异常调用执行lambda函数时,打印出来的guest是空的或者乱码
原因说明
上面代码中func3是异步调用,其中的lambda函数会在异步调用成功时被调用。因此当func1函数运行结束并返回时,func3中的lambda函数并没有执行。
这时,由于GUEST是char*类型,而func2参数类型为std::string,因此func2在调用时触发隐式类型转换,生成一个临时的std::string变量。这个变量在func1运行结束时会自动释放。
因此,上面的代码的std::cout可能会导致内存访问异常错误。
如何解决
解决方法有以下几种
- lambda函数使用值传递
- 传递给func2的参数使用全局的std::string类型,避免隐式类型转换。