浅谈C 中的内存管理
2008-02-23 05:25:13来源:互联网 阅读 ()
大家都知道变量的生存周期这个概念,可是有的时候变量生存周期已结束,但是所分配的那块内存空间还是存在的。文章举了四个不同的例子,来说明这其中的原因。
前言:
前一段时间在一个好友的的博客论坛上看到他学习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 /*地址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。 cout<<*j; //*j is 20 and j is 0x0012ff74 /*此时同时能够看到k的地址是0x00000000,说明k这个变量 |
至此,我们分析完了程式的全过程的内存分配情况,最终结果是这样的。(图1)
我们同时也能够在Memory里面看看这个地址的具体内容。我们能够看到是14,这是十六进制的数,化成十进制,正好是20。(图2)
现在大家应该对上面那个程式的执行过程有一个大概地了解了吧!但是这个还不是我们想要得到的结果,我们需要的是打印一个不确定的结果。有了以上的分析,我们开始新的程式,让他打印出我们想要的东西。
对于上面的程式,我们需要改变的是令变量j指向一个地址被释放的位置。于是就有了下面的程式。
int * foo() int main() |
编译器很“聪明”,编译后会给出一个警告。原话是“returning address of local variable or temporary”,指向的是上面程式的第四行,也就是return &l;这条语句。那句英文的意思也不用我再多解释了,相信大家都能看得明白。
执行的结果,在debug下,是20;在release下,结果是4198795。显然那部分内存被释放掉了。这是因为在debug的程式里面,执行完函数foo,并没有立即释放掉l的那个地址(现在我不清楚这句话说得是否精确)。在这个程式的release版本中,显然程式释放了那部分的地址,所以指向了一个不确定的数。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: 控制C 的内存分配
下一篇: C 实现委托和消息反馈模板
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash