局部变量或局部对象是否可以返回

一、C语言中局部变量的返回

大原则:不要在自动变量(不管是表达式中间结果的临时变量(如果它不能保证总优化到寄存器中)还是源程序中有明确名字的auto变量)生命期结束后还试图解引用它。

  • 局部变量作为返回值时,一般是系统先申请一个临时对象存储局部变量,也就是找个替代品,这样系统就可以回收局部变量,返回的只是个替代品。也就是说,返回的过程中产生了“中间变量”作为纽带。
  • 但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。这个问题也是可以解决的,可以把局部变量变为静态变量或者全局变量,这样就不存放在栈中了,而是存放在静态存储区,不会被回收。
  • 返回指向堆内存的指针是可以的。因为程序在运行的时候用 malloc 申请任意多少的内存,程序员自己负责在何时用 free释放内存。动态内存的生存期由程序员自己决定,使用非常灵活。
二、C++中局部对象的返回

大原则:C++中千万不要返回局部对象或变量的引用和指针

  • 栈上的对象是可以返回的,不可返回栈上对象的引用(除非返回对象本身)。
    原因:如果是栈上的对象返回,本质上是返回该对象进行了一次拷贝后的副本,即使原对象被析构或被存储该对象的内存地址被覆盖都无所谓;但如果是栈上对象的引用或指针,本质上返回的是该内存地址的副本,如果该地址中的存放的对象被析构或者被覆盖,则返回的结果也会出错。
三、总结

能不能返回局部变量或局部对象的指针或引用关键是看返回后该局部变量是否还会一直存在于内存中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值