



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
浅谈C+中的内存管理2003-08-04 14:43 作者: 曹翼飞 出处: 放飞技术网 责任编辑:方舟 摘要: 大家都知道变量的生存周期这个概念,可是有的时候变量生存周期已经结束,但是所分配的那块内存空间还是存在的。文章举了四个不同的例子,来说明这其中的原因。 前言: 前一段时间在一个好友的的博客论坛上看到他学习C+时遇到的一小点问题,是关于C+中最基本的内存分配方面的。其实对于内存这东西,除了知道我自己用的是256M的内存以外,我也不太清楚他到底里面是怎么工作的。看了大师们的讲解,我深有体会,把这些讲解整理出来,为所有C+的newbie们共勉!正文:事情是因为这样一小段程序而来的。int main() int i=10; int *j=&i; if(!0) int l=20;int *k=&l;j=k;k=0;cout*j;return 0;不用编译器,大家想想执行过之后应该打印什么结果?我想大家的第一反应应该是打印出一个不确定的数。理由是在if语句里,我们定义了k这个变量,在if执行结束之后,这个变量k所占据的内存是被系统收回的,于是也就造成了变量j所指的结果非常不确定。当然,如果编译并且执行过后,我们发现事情并不是像我们想象的那样,程序最终的打印结果是20,并不是我们期待的一个不确定的数。下面就让我们分析一下原因吧!我们用debug的方式来一步一步的分析,在watch的窗口下输入里面所有的变量。int i=10; /i is 10 and &i is 0x0012ff7c int *j=&i;/*j is 10 and &j is 0x0012ff7c /显然可以看出此时两个变量指的是同一地址 if(!0)int l=20; /l is 20 and &l is 0x0012ff74 /*地址0x0012ff7c0x0012ff75被占据。要说明的是,这个数值很有可能因为电脑硬件的不同而不同。*/ int *k=&l; /*k is 20 and &k is 0x0012ff74 /变量k与l指向同一地址。 j=k; /j is 0x0012ff74 and *j is 20/*指针间的赋值,这个语句的意思是把k指向的地址负值给j。此时这两个变量指向的是同一个地址,都是0x0012ff74,而那块地址存放的是20,所以也就有*j是20的原因。*/ cout*j;/*j is 20 and j is 0x0012ff74 /*此时同时可以看到k的地址是0x00000000,说明k这个变量已经被自动销毁,所以地址指零。但是j所指的并不是k,而是k所指的那段地址0x0012ff74,而由于此时j的生存周期还没有结束(j是在if意外定义的),所以j指向的这块地址并没有被收回,也就保存下来20这个数了。*/至此,我们分析完了程序的全过程的内存分配情况,最终结果是这样的。(图1)我们同时也可以在Memory里面看看这个地址的具体内容。我们可以看到是14,这是十六进制的数,化成十进制,正好是20。(图2)现在大家应该对上面那个程序的执行过程有一个大概地了解了吧!不过这个还不是我们想要得到的结果,我们需要的是打印一个不确定的结果。有了以上的分析,我们开始新的程序,让他打印出我们想要的东西。对于上面的程序,我们需要改动的是令变量j指向一个地址被释放的位置。于是就有了下面的程序。int * foo() int l=20;return &l;int main()int i=10;int *j=&i;j = foo();cout*j;return 0;编译器很“聪明”,编译后会给出一个警告。原话是“returning address of local variable or temporary”,指向的是上面程序的第四行,也就是return &l;这条语句。那句英文的意思也不用我再多解释了,相信大家都能看得明白。执行的结果,在debug下,是20;在release下,结果是4198795。显然那部分内存被释放掉了。这是因为在debug的程序里面,执行完函数foo,并没有立即释放掉l的那个地址(目前我不清楚这句话说得是否精确)。在这个程序的release版本中,显然程序释放了那部分的地址,所以指向了一个不确定的数。这里还要说一件事情,就是在第一个程序当中,无论是debug版本还是release版本。执行完那个if语句以后,系统都是不会真正的把l清除掉,l只是k的一个别名。上面的程序是这样写的,用了*j=&i这样一句负值语句,而别名在MSDN中的解释与引用是相同的,所以也可以这样理解,int i=10; int &j=i;与上面的相同。不要去想上面这些程序了,大家再看看下面这个。 void f1( int *& j) int l=20; int *k=&l; j=k; k=0; void any_function_use_local_variables()int a,b,c; a=b=c=100; int main() int i=10; int *j=&i; f1(j); cout*j; any_function_use_local_variables(); cout*j; return 0;请大家自己编译、执行,看看结果是什么,然后结合上面的两个例子,想想是为什么。下面再给大家一个小例子,可能会有助于理解内存的概念。程序的过程是试图去增加i,使之超过最大的整数。有一种情况是这个值被“卷回来”变成一个负数,在我的机器上程序的打印结果是-214748364
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 育婴师工作实践心得试题及答案
- 系统架构设计师考试的学习心得与体会试题及答案
- 西医临床实习生知识考察试题及答案
- 药物研究的多学科协作模式探讨试题及答案
- 工程应用题试题及答案
- 系统架构设计师考试职场软技能的重要性试题及答案
- 系统架构设计师考试复杂性应对策略及试题答案
- 光电工程师考试复习要点与试题
- 艺术设计考研试题及答案
- 提升考试能力的网络规划设计师试题及答案
- DB6110-T 039-2023 桔梗栽培技术规范
- 部编版初中语文文言文主题分类梳理1
- 第8课 用制度体系保证人民当家做主
- 砂子检验报告-焦化
- 六年级合作取得更大的成功辩论
- 执业兽医机构聘用证明或服务协议
- 卓越绩效调研提纲
- 【经典】一次性使用氧气湿化瓶-一次性使用加湿型鼻氧管介绍教学课件
- 建筑施工企业预结算制度
- 2023年中央民族大学事业编制人员招聘(共500题含答案解析)笔试历年难、易错考点试题含答案附详解
- 托管中心消防应急预案
评论
0/150
提交评论