函数体——返回值——小心返回自动对象的引用或指针

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

小心返回自动对象的引用或指针

一、问题

返回自动对象的引用

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();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值