浅谈C++中的内存管理.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅谈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   /*地址0x0012ff7c—0x0012ff75被占据。要说明的是,   这个数值很有可能因为电脑硬件的不同而不同。*/   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的地址是0说明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版本。执行完那

文档评论(0)

82393aa + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档