函数返回的问题

LJLOVELZ 2009-05-12 12:46:02
const string &HH(const string &str)
{
string A = str;
return A;
};//执行OK,返回正确的值

const string &HH(const string &str)
{
string A = “TEST”;
return A;
};//执行ERROR,返回的值不是"TEST"

请问:
string A都是函数内的局部变量。
返回他的引用应该是无效的啊?(栈上的数据在返回时就自动销毁了啊)
为什么第一个能正确返回
第二个错了呢??
...全文
124 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenzhp 2009-05-12
  • 打赏
  • 举报
回复
const string &HH(const string &str)
{
string A = str;
return A;
};//因为这里 A是对你从外部传入参数的引用。而其参数str是const的。是不会随着函数声明周期而消亡的。所以,是有效的

const string &HH(const string &str)
{
string A = “TEST”;
return A;
};//执行ERROR,返回的值不是"TEST"
yshuise 2009-05-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 LJLOVELZ 的回复:]
一般函数返回时不要返回引用和指针
但现在我想知道上面的两个函数有什么区别?
为什么会出现那样的结果?
[/Quote]
都是错误的。
编译表现正确不一定正确。
crst_zh 2009-05-12
  • 打赏
  • 举报
回复
第一个返回局部对象,而不是引用,在返回的时候构造了一个临时对象
第二个是字符串常量,在静态数据去,好像还存在“写时复制”的问题,期待高手

一个例子
char* p1="AAAA";
char* p2="AAAA";
则p1==p2
但是 char p1[]="AAAA";
char p2[]=“AAAA”;
则:p1!=p2



LJLOVELZ 2009-05-12
  • 打赏
  • 举报
回复
一般函数返回时不要返回引用和指针
但现在我想知道上面的两个函数有什么区别?
为什么会出现那样的结果?
yshuise 2009-05-12
  • 打赏
  • 举报
回复
别这样使用。
Jalien 2009-05-12
  • 打赏
  • 举报
回复
恩,都是返回局部变量的引用,都是错的,vs 2008中均提示 warning C4172: 返回局部变量或临时变量的地址。
string A = str,这个做了一次拷贝,不是指向外部的引用了。
[Quote=引用 11 楼 wangyadong 的回复:]
你这两个其实都是错误的,第一个正确其实是因为编译器优化,歪打正着了,
string A = str;优化后A和str指向同一个地址,并没有新开内存,所以你返回的不是局部变量的引用。

注意两者都是返回局部变量的引用,这个是绝对不允许的,我在2005下,两个运行都是错误的
[/Quote]
hjjdebug 2009-05-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 LJLOVELZ 的帖子:]
const string &HH(const string &str)
{
string A = str;
return A;
};//执行OK,返回正确的值

const string &HH(const string &str)
{
string A = “TEST”;
return A;
};//执行ERROR,返回的值不是"TEST"

请问:
string A都是函数内的局部变量。
返回他的引用应该是无效的啊?(栈上的数据在返回时就自动销毁了啊)
为什么第一个能正确返回
第二个错了呢??
[/Quote]
vc6 下的结果,retrun A 均有warning
warning C4172: returning address of local variable or temporary
warning C4172: returning address of local variable or temporary
第一个执行崩溃,第二个执行崩溃。
崩溃提示:unhandled exception: Access violation
LJLOVELZ 2009-05-12
  • 打赏
  • 举报
回复
谢谢各位
呵呵
得出结论:
千万不要返回局部对象的引用,指针.
aaaa3105563 2009-05-12
  • 打赏
  • 举报
回复
帮顶··
wangyadong 2009-05-12
  • 打赏
  • 举报
回复
你这两个其实都是错误的,第一个正确其实是因为编译器优化,歪打正着了,
string A = str;优化后A和str指向同一个地址,并没有新开内存,所以你返回的不是局部变量的引用。

注意两者都是返回局部变量的引用,这个是绝对不允许的,我在2005下,两个运行都是错误的
LJLOVELZ 2009-05-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 Jalien 的回复:]
当返回引用时,必须像从函数中返回一个指针一样对待,返回时无论引用关联的是什么都应该存在,否则不知道是指向哪一块内存。
lz的那个前者正确是因为返回的是外部引用,当这个函数退出,退栈时外部引用的那块内存并没有被取消。
而后者string A = “TEST”; 这里的A是这个函数局部的变量,当函数结束时,局部变量A被取消了,存储结果不存在,而对这块内存进行引用时没有意义的,因此会出错。

[/Quote]

如果是下面的:两个返回的结果都是对的,该怎么解释啊?
const int &ABC(const int &A,const int &B)
{
int a = 154;
return a;
};

const int &ABC(const int &A,const int &B)
{
return (A+B);
};
LJLOVELZ 2009-05-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chenzhp 的回复:]
const string &HH(const string &str)
{
string A = str;
return A;
};//因为这里 A是对你从外部传入参数的引用。而其参数str是const的。是不会随着函数声明周期而消亡的。所以,是有效的

const string &HH(const string &str)
{
string A = “TEST”;
return A;
};//执行ERROR,返回的值不是"TEST"

[/Quote]
将const string &HH(const string &str)-->const string &HH(string &str)一样返回OK
Jalien 2009-05-12
  • 打赏
  • 举报
回复
当返回引用时,必须像从函数中返回一个指针一样对待,返回时无论引用关联的是什么都应该存在,否则不知道是指向哪一块内存
lz的那个前者正确是因为返回的是外部引用,当这个函数退出,退栈时外部引用的那块内存并没有被取消
而后者string A = “TEST”; 这里的A是这个函数局部的变量,当函数结束时,局部变量A被取消了,存储结果不存在,而对这块内存进行引用时没有意义的,因此会出错。
crst_zh 2009-05-12
  • 打赏
  • 举报
回复
楼上的,不好意思,看错了:)
crst_zh 2009-05-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chenzhp 的回复:]
const string &HH(const string &str)
{
string A = str;
return A;
};//因为这里 A是对你从外部传入参数的引用。而其参数str是const的。是不会随着函数声明周期而消亡的。所以,是有效的
我怎么看不出来A是引用,我知道str是引用,但是不知道为什么A会是引用!

const string &HH(const string &str)
{
string A = “TEST”;
return A;
};//执行ER


ERRROR,返回的值不是"TEST"
[/Quote]

65,211

社区成员

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

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