局部变量与指针指向引发的血案.docxVIP

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

当看到林锐的《高质量c++/c编程指南》中的野指针的时候有这么一段文字引起了我的深刻思考与实践。 请看原文 【【 ?????指针操作超越了变量的作用范围。这种情况让人防不胜防,示例程序如下: class A { public: void Func(void){ cout “Func of class A” endl; } }; void Test(void) { A *p; { A a; p = a; // 注意 a 的生命期 } p-Func(); // p 是“野指针” } 函数 Test 在执行语句 p-Func()时,对象 a 已经消失,而 p 是指向 a 的,所以 p 就 成了“野指针” 。但奇怪的是我运行这个程序时居然没有出错,这可能与编译器有关。 】】 怎么进一步挖掘问题? 1.我们首先要搞清楚的是局部变量a的作用范围的,如作者认为的,a的生命周期在一个它所在 { ?} 内?, 根据我们多局部变量的认识生命周期结束时a消亡,程序释放内存。但是我们又进入了另一个问题,程序释放内存后,内存的内容会不会改变呢,?于是我又做了一下实验 ? 很多人可能不理解为什么指针p指向0x0012ff40这个内存单元,其实,程序分陪内存,也不是乱分的,它也是按照一定规则分配的, 这里不是问题的重点(不再多说),这个内存单元其实就是局部变量a的生命周期内,操作系统分配各a的,而在a的生命周期内,a=3即程序把3放在了系统给a分配的地址内。?问题就是当a消亡时,它所在的内存内容会不会改变,其实运行上面简单的程序就能靠近真相,我们看看结果 ? 现在我们已经明确了这一点:局部变量消亡时,程序只是摧毁了这个局部变量的标示符,并释放内存而已,所谓释放内存的意思是把程序所占的内存交还与系统,失去对这块内存的“占有权”。而对内存的内容并没有做清除工作,也就是内存的内容依旧存在,这也是为什么上面的实验中地到3的结果?。 ?2.搞清局部的问题我们就开始了指针的问题,很多同学认为指针很难,但是如果能从本质看指针指向角度思考的话,也许会开朗不少。作者林锐博士也是资深的编程专家,真的没想到他会有这样的推理:函数 Test 在执行语句 p-Func()时,对象 a 已经消失,而 p 是指向 a 的,所以 p 就成了“野指针” 。。。。我们现在的关键问题是指针到底指向的是什么,作者认为p是指向a,而大家应该都知道指针指向的是地址,我们所认为的a,p什么的说白了就是一堆标识符而已,它可以代表一个变量,一个指针,一个地址,或者一个常量等等。值得注意的是代表地址的标识符?和地址肯定有所不同,这点很容易明白,如这道题中的局部变量标识符?,标识符消亡时,它的之前所分配的内存不会消亡,或者这么理解,这个标识符,失去了与这段内存的关系。回归本题,我们会意识到p指向的不是a,而是a所关联的那个内存,局部变量a的消亡时,p已经与a所关联的内存建立的联系,无论a消不消亡,p都一直指向a的那块内存。到现在所有问题都解决了,p不会像作者认识的会成为野指针,进一步验证如下: ?

文档评论(0)

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

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

1亿VIP精品文档

相关文档