| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 759 人关注过本帖
标题:[求助]关于非值传递函数返回的问题
只看楼主 加入收藏
anlogo
Rank: 2
等 级:论坛游民
威 望:1
帖 子:293
专家分:20
注 册:2007-7-20
结帖率:100%
收藏
 问题点数:0 回复次数:7 
[求助]关于非值传递函数返回的问题
使用的编译器是VC6.0
请先看下面的程序:
#include <iostream>
int &functionOne()
{
   int TEMP  = 10;
   int *temp = &TEMP; //编译器虽然没有出现警告,但这样的程序可靠吗?
   return *temp; //正确
}
int &functionTwo()
 {
   int temp = 10;
   return temp; //警告提示warning
}
int *functionThree()
 {
   int temp = 20;
   return &temp; //警告提示warning}
int main()
 {
   int &one = functionOne();
   int &two = functionTwo();
   int *three = functionThree();
   std::cout << one  << two << *three;
   return 0;
}
编译可以通过但出现警告,提示是:returning address of local variable or temporary (位置是functionTwo和functionThree函数的return语句)
我的问题是这样的:
为什么functionOne没有出现警告呢?
难道使用指针来创建变量,在函数返回时不会作为局部变量而被丢弃?

[新问题]
若将functionTwo函数改为如下:
则编译时没有出现警告了,这又是为什么呢?
int &functionTwo()
{
   int TEMP = 10;
   int &temp = TEMP;  //在函数返回时,变量TEMP及其同名变量temp应该被丢弃,那么这个程序可靠吗?
   return temp; //正确
}
thank you for your help.

[[it] 本帖最后由 anlogo 于 2008-4-8 13:09 编辑 [/it]]
搜索更多相关主题的帖子: 传递函数 
2008-04-08 11:14
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
你用new来创建的对象始终存在于内存,除非你释放掉..functionOne是对new创建的内存引用..其他的你对局部变量的引用是不和法的..一旦过了生存期你的局部变量的内存是要被释放掉得..你对它建立引用,结果是难以预料的

学习需要安静。。海盗要重新来过。。
2008-04-08 11:50
anlogo
Rank: 2
等 级:论坛游民
威 望:1
帖 子:293
专家分:20
注 册:2007-7-20
收藏
得分:0 
oh..thank you.
functionOne是使用了new创建的内存,明白了(实在是太菜了..)
functionTwo引用返回时出现的警告我也明白了
thanks.
但还有个地方不明白,为什么functionThree 返回的是temp的地址,即使temp被丢弃,返回的地址应该仍然是temp被丢弃前的地址啊,不是吗? 这个地址重新被指针three指向,难道这不对吗? 按我的说法,那么functionThree的警告是不是可以不理会呢?

[[it] 本帖最后由 anlogo 于 2008-4-8 12:11 编辑 [/it]]
2008-04-08 12:08
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
警告肯定是有的..毕竟编译器认为你是返回临时变量地址.给出警告但是没有报错,就是说编译器检测到异常,但是这个异常可以运行..你运行一下,结果不一定错..但是由于这个临时变量已经释放那么你很难保证这个地址不会被从新分配给其它变量使用.一旦分配了,你就得不到你要的结果了.

学习需要安静。。海盗要重新来过。。
2008-04-08 12:15
anlogo
Rank: 2
等 级:论坛游民
威 望:1
帖 子:293
专家分:20
注 册:2007-7-20
收藏
得分:0 
哦.嗯,你说的很对!
刚才又发现个新问题:
我将functionOne改了下.如下:
int &functionOne()
{
   int TEMP = 10;
   int *temp = &TEMP;
   return *temp; //正确
}
好奇怪,编译器竟然没有敬告!!!!!!!!!!!
为什么啊? 晕了......
2008-04-08 12:23
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
估计是编译器没检查TEMP或许在词法语法阶段它没考虑到这样的问题吧..这个是个人观点..有谁知道可以说一下..呵呵

学习需要安静。。海盗要重新来过。。
2008-04-08 12:39
anlogo
Rank: 2
等 级:论坛游民
威 望:1
帖 子:293
专家分:20
注 册:2007-7-20
收藏
得分:0 
越来越奇怪 我按照functionOne的方法重新改写了functionTwo和functionThree,结果发现警告没了...
请看:
int &functionTwo()
{
   int TEMP = 10;
   int &temp = TEMP;
   return temp; //正确
}
int *functionThree()
{
   int TEMP = 10;
   int &temp = TEMP;
   return &temp; //正确
}
2008-04-08 13:03
anlogo
Rank: 2
等 级:论坛游民
威 望:1
帖 子:293
专家分:20
注 册:2007-7-20
收藏
得分:0 
这些程序都非常危险,包括原来的functionOne函数:
int &functionOne()
{
   int *temp =new int;
   *temp = 10;
   return *temp; //正确
}
2008-04-08 15:09
快速回复:[求助]关于非值传递函数返回的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024333 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved