提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
小心返回自动对象的引用或指针
一、问题
返回自动对象的引用
int &fun()
{
int x=3;
return x;//注意x这里会被销毁
}
int main()
{
int &ref=fun();
//这里相当于把ref绑定到了fun()的返回值x上,
//但是x在fun()结束时已经被销毁了
}
同样还有返回自动对象的指针
int *fun()
{
int x=3;
return &x;//返回x的地址
}
int main()
{
int *ptr=fun();
//ptr指向了一个已经销毁的对象
}
类似的还有initializer_list,可变长度模板参数
std::initializer_list<int> fun()
{
return {1,2,3,4,5};//返回的是首元素和末尾元素下一位的指针
}
int main()
{
auto x=fun();
//x指向了一个已经销毁的对象的第一位和末尾元素下一位
}
二、如何解决
加一个static,让x变成局部静态对象,延长生命周期
int *fun()
{
static int x=3;//x现在是局部静态对象,生命周期是从首次出现到整个程序结束
return &x;
}
int main()
{
int *ptr=fun();
}