引用型返回函数的问题

skyfree 2008-03-11 11:39:35
关于函数返回引用或指针类型, 我一直以来的概念就是,不能返回局部变量的指针或引用,因为局部变量在函数返回时会被释放。因此返回的指针或引用就会被悬空。
可是下面的这个例子(vs2005中测试)的结果却不是这样,
请大家给解释一下。


#include "stdafx.h"
#include <iostream>
class A
{
public:
int i;
A(int k):i(k){};
~A()
{
}

};

class B
{public:
int m;
B(int n):m(n){};

A& getA()
{
A a1(5);
return a1; //???这里应该有问题,但测试结果显示,该方法确实返回a1(5)
}
};



int _tmain(int argc, _TCHAR* argv[])
{

B b(1);
A a=b.getA(); //
std::cout<<a.i<<std::endl; //结果为5!!!
return 0;
}
...全文
105 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaosi2468 2011-08-02
  • 打赏
  • 举报
回复
原来如此...
可是,关于返回引用的函数会不会产生副本,什么条件下产生,求高人解惑
ppzzhhsky 2008-03-11
  • 打赏
  • 举报
回复
oakfire 正解
IT_lau 2008-03-11
  • 打赏
  • 举报
回复
关注
dubiousway 2008-03-11
  • 打赏
  • 举报
回复
你前面的理解是对的。

但是只把返回值用别的变量保存,这样是没问题的。
如果返回值是个地址(而且地址指向的变量是在函数内定义的),那么如果后面的语句想对地址指向的变量进行读写访问,就会有错误。(new 申请的空间除外)
ppzzhhsky 2008-03-11
  • 打赏
  • 举报
回复
返回的只是一个随机数,原先分配的内存没被改动所以还是返回5
baihacker 2008-03-11
  • 打赏
  • 举报
回复
LZ理解基本没错...
lori227 2008-03-11
  • 打赏
  • 举报
回复
程序相对简单,返回的那快内存地址没有被其他数据覆盖,所以结果还在~~~
我用2008编译的时候,有提示警告~~~~

warning C4172: 返回局部变量或临时变量的地址
oakfire 2008-03-11
  • 打赏
  • 举报
回复
我是这么理解的:释放是会的,但“返回的指针或引用就会被悬空”是不对的,指针值还是那个值,只要原先分配的内存没被改动过,那么还是能正常运行下去,但这是非常非常非常危险的。

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧