免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2758 | 回复: 9
打印 上一主题 下一主题

[C++] 请问函数里的变数会自动释放吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-11 23:50 |只看该作者 |倒序浏览
code是这样的
  1. #include <iostream>
  2. using namespace std;
  3. int a(int b)
  4. {
  5.     int c;
  6.     c=b​​;
  7.     return c;
  8.    
  9.     }
  10. int main()
  11. {
  12. a(2);
  13. a(3);


  14. system("pause");
  15. return 0;
  16. }
复制代码
在a(2)第一次呼叫并宣告int c
请问return c离开这函式后int c就自动释放了吗?
在a(3)进去在宣告in​​t c这个是全新的int c吗?(并永远不可能发生重复宣告错误发生吗?)
如果这函式常用里面的int c改成全域变数,会比较好吗?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2013-08-12 02:32 |只看该作者
局部变量无副作用,别担心

论坛徽章:
0
3 [报告]
发表于 2013-08-12 10:39 |只看该作者
在a(2)第一次呼叫并宣告int c
请问return c离开这函式后int c就自动释放了吗?
在a(3)进去在宣告in​​t c这个是全新的int c吗?(并永远不可能发生重复宣告错误发生吗?)
如果这函式常用里面的int c改成全域变数,会比较好吗?


局部变量保存在栈中, a(2)和a(3) 执行后, 变量C都会自动释放, 所以按你的说法,每次调用都可以认为是一个新的,独立的变量。 不过执行函数 a时, 变量c的地址都一样。如果改成全局变量, 那多次调用变量C还是同一个变量。

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
4 [报告]
发表于 2013-08-12 11:26 |只看该作者
呼叫、宣告、变数,LZ是台湾人吗?

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2013-08-12 11:44 |只看该作者
函数的自动变量在栈上面,只会起到中间计算的作用

函数执行完毕之后,该函数的栈帧内容就不再需要了

论坛徽章:
0
6 [报告]
发表于 2013-08-12 12:20 |只看该作者
zhaohongjian000 发表于 2013-08-12 11:26
呼叫、宣告、变数,LZ是台湾人吗?


我也感觉是的。{:3_189:}

论坛徽章:
0
7 [报告]
发表于 2013-08-13 14:37 |只看该作者
自动变量自动释放  

论坛徽章:
1
申猴
日期:2013-09-09 10:22:56
8 [报告]
发表于 2013-08-14 09:43 |只看该作者
楼主估计是看了侯捷的书, ,,

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
9 [报告]
发表于 2013-08-14 11:07 |只看该作者
回复 1# 801901987


    你没有理解作用域和生存周期的问题,int是scalar type,scalar type对象的赋值都是by value的方式。比如说return c;那么c的值就copy到了函数的返回值中,函数退出后c就不存在,这时没有关系因为c的值已经copy到内存中函数的返回值中了。C标准规定的存储周期类型只有三种:static,automatic,allocated。存储周期类型决定对象的生命周期(An object has a storage duration that determines its lifetime. There are three storage
durations: static, automatic, and allocated.),全局变量的存储类型为static,普通局部变量的存储类型为automatic。存储类型为static的对象在main函数(The function called at program startup is named main.)调用前进行初始化(All objects with static storage duration shall be initialized (set to their initial values) before program startup.),automatic类型的变量的生存周期仅限于包含它的块(A block with initialization of an object that has automatic storage duration),当执行进入代码块时初始化局部变量,在执行完代码块时销毁局部变量。

论坛徽章:
0
10 [报告]
发表于 2013-08-14 12:56 |只看该作者
801901987 发表于 2013-08-11 23:50
code是这样的在a(2)第一次呼叫并宣告int c
请问return c离开这函式后int c就自动释放了吗?
在a(3)进去在宣 ...


楼主遇到这种疑惑时,建议不要使用基本类型,自己写个类,在构造和析构中加打印语句,就一目了然了,比臆想揣测来得感性得多,否则想半天也很抽象。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP