浅谈c++中的内存管理

浅谈c++中的内存管理

ID:5507942

大小:35.00 KB

页数:4页

时间:2017-12-16

浅谈c++中的内存管理_第1页
浅谈c++中的内存管理_第2页
浅谈c++中的内存管理_第3页
浅谈c++中的内存管理_第4页
资源描述:

《浅谈c++中的内存管理》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、浅谈C++中的内存管理2003-08-0414:43作者:曹翼飞出处:放飞技术网责任编辑:方舟  摘要:  大家都知道变量的生存周期这个概念,可是有的时候变量生存周期已经结束,但是所分配的那块内存空间还是存在的。文章举了四个不同的例子,来说明这其中的原因。  前言:  前一段时间在一个好友的的博客论坛上看到他学习C++时遇到的一小点问题,是关于C++中最基本的内存分配方面的。其实对于内存这东西,除了知道我自己用的是256M的内存以外,我也不太清楚他到底里面是怎么工作的。看了大师们的讲解,我深有体会,把这些讲解整理出来,为

2、所有C++的newbie们共勉!  正文:  事情是因为这样一小段程序而来的。intmain(){  inti=10;  int*j=&i;  if(!0)  {    intl=20;    int*k=&l;    j=k;    k=0;  }  cout<<*j;  return0;}  不用编译器,大家想想执行过之后应该打印什么结果?我想大家的第一反应应该是打印出一个不确定的数。理由是在if语句里,我们定义了k这个变量,在if执行结束之后,这个变量k所占据的内存是被系统收回的,于是也就造成了变量j所指的结果非常

3、不确定。当然,如果编译并且执行过后,我们发现事情并不是像我们想象的那样,程序最终的打印结果是20,并不是我们期待的一个不确定的数。下面就让我们分析一下原因吧!  我们用debug的方式来一步一步的分析,在watch的窗口下输入里面所有的变量。inti=10; //iis10and&iis0x0012ff7cint*j=&i; //*jis10and&jis0x0012ff7c      //显然可以看出此时两个变量指的是同一地址if(!0){  intl=20;//lis20and&lis0x0012ff74  /*地址

4、0x0012ff7c—0x0012ff75被占据。要说明的是,  这个数值很有可能因为电脑硬件的不同而不同。*/  int*k=&l;//*kis20and&kis0x0012ff74  //变量k与l指向同一地址。  j=k; //jis0x0012ff74and*jis20  /*指针间的赋值,这个语句的意思是把k指向的地址负值给j。  此时这两个变量指向的是同一个地址,都是0x0012ff74,而那  块地址存放的是20,所以也就有*j是20的原因。*/}cout<<*j; //*jis20andjis0x0012

5、ff74/*此时同时可以看到k的地址是0x00000000,说明k这个变量已经被自动销毁,所以地址指零。但是j所指的并不是k,而是k所指的那段地址0x0012ff74,而由于此时j的生存周期还没有结束(j是在if意外定义的),所以j指向的这块地址并没有被收回,也就保存下来20这个数了。*/  至此,我们分析完了程序的全过程的内存分配情况,最终结果是这样的。(图1)  我们同时也可以在Memory里面看看这个地址的具体内容。我们可以看到是14,这是十六进制的数,化成十进制,正好是20。(图2)  现在大家应该对上面那个程序

6、的执行过程有一个大概地了解了吧!不过这个还不是我们想要得到的结果,我们需要的是打印一个不确定的结果。有了以上的分析,我们开始新的程序,让他打印出我们想要的东西。  对于上面的程序,我们需要改动的是令变量j指向一个地址被释放的位置。于是就有了下面的程序。int*foo(){  intl=20;  return&l;}intmain(){  inti=10;  int*j=&i;  j=foo();  cout<<*j;  return0;}  编译器很“聪明”,编译后会给出一个警告。原话是“returningaddress

7、oflocalvariableortemporary”,指向的是上面程序的第四行,也就是return&l;这条语句。那句英文的意思也不用我再多解释了,相信大家都能看得明白。  执行的结果,在debug下,是20;在release下,结果是4198795。显然那部分内存被释放掉了。这是因为在debug的程序里面,执行完函数foo,并没有立即释放掉l的那个地址(目前我不清楚这句话说得是否精确)。在这个程序的release版本中,显然程序释放了那部分的地址,所以指向了一个不确定的数。这里还要说一件事情,就是在第一个程序当中,无

8、论是debug版本还是release版本。执行完那个if语句以后,系统都是不会真正的把l清除掉,l只是k的一个别名。上面的程序是这样写的,用了*j=&i这样一句负值语句,而别名在MSDN中的解释与引用是相同的,所以也可以这样理解,inti=10;int&j=i;与上面的相同。不要去想上面这些程序了,大家再看看下面这个

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。