找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 4312|回复: 1

【推荐】关于空悬指针

[复制链接]

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2009-2-25 11:42:45 | 显示全部楼层 |阅读模式
<p><font face="Verdana">&nbsp;/*什么叫空悬指针:指针所指向的存储区的生存期以及结束,但是指针的生存期还没有结束,导致 <br/>存储区的数据已经被释放,指针所指的区域是个随机值的这种错误。那么这个指针就叫空悬指针。 <br/>出现空悬指针的两种常见情况: <br/>1.函数返回一个自动型局部变量的地址,我以前就经常出现这种情况 <br/>2.删除一个动态分配的对象以后,没有将指针指0,后面使用到这个指针的时候其实已经指向一个 <br/>随机值。 <br/>对2的一点补充,注意动态分配的时候,指针的生存期跟指针所指区域的生存期是两个不同的概念。 <br/>指针的生存期从程序开始运行开始,结束于程序结束运行,指针本身的存储区间是编译的时候就 <br/>确定的,指针所指的动态分配的区间的生存期从new开始,到delete结束,所以如果调用delete后 <br/>没有把指针指0就出现了空悬指针,此时很容易犯错误。 </font></p>
<p><font face="Verdana">解决空悬指针的方法:1.对应情况1,函数返回一个静态局部变量 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.对应情况2,调用delete以后,将指针指空。 <br/>*/ <br/>#include&lt;iostream&gt; <br/>using namespace std; <br/>int * add1(const int &amp; a,const int &amp;b) <br/>{ <br/>&nbsp;&nbsp;&nbsp; int c=a+b; <br/>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"在函数add1的内部结果为"&lt;&lt;c&lt;&lt;endl; <br/>&nbsp;&nbsp;&nbsp; return &amp;c; <br/>} <br/>//哈哈,在编译这个函数的时候vc6.0给出了下面的警告: <br/>//warning C4172: returning address of local variable or temporary </font></p><font face="Verdana">
<p><br/>int * add2(const int &amp;a,const int &amp; b) <br/>{ <br/>&nbsp;&nbsp;&nbsp; static int c=a+b; <br/>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"在函数add2的内部结果为"&lt;&lt;c&lt;&lt;endl; <br/>&nbsp;&nbsp;&nbsp; return &amp;c; <br/>} </p>
<p>int * add3(const int &amp;a,const int &amp;b) <br/>{ <br/>&nbsp;&nbsp;&nbsp; int *p=new int; <br/>&nbsp;&nbsp;&nbsp; *p=a+b; <br/>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"在函数add3的内部结果为"&lt;&lt;*p&lt;&lt;endl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; return p; <br/>} </p>
<p>void main() <br/>{ <br/>&nbsp;&nbsp;&nbsp; int a=1,b=2,*p; <br/>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"调用add1返回一个空悬指针\n"; <br/>&nbsp;&nbsp;&nbsp; p=add1(a,b); <br/>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"指针所指的值为"&lt;&lt;*p&lt;&lt;endl; <br/>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"指针所指的值发生改变 了吗?\n"&lt;&lt;(*p==3?"没有改变":"改变")&lt;&lt;endl; <br/>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"调用add2可以避免返回一个空悬指针 "&lt;&lt;endl; <br/>&nbsp;&nbsp;&nbsp; p=add2(a,b); <br/>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"指针所指的值为"&lt;&lt;*p&lt;&lt;endl; <br/>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"指针所指的值发生改变 了吗?\n"&lt;&lt;(*p==3?"没有改变":"改变")&lt;&lt;endl; <br/>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"调用add3可以避免返回一个空悬指针 "&lt;&lt;endl; <br/>&nbsp;&nbsp;&nbsp; p=add3(a,b); <br/>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"指针所指的值为"&lt;&lt;*p&lt;&lt;endl; <br/>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"指针所指的值发生改变 了吗?\n"&lt;&lt;(*p==3?"没有改变":"改变")&lt;&lt;endl; <br/>&nbsp;&nbsp;&nbsp; delete p; <br/>&nbsp;&nbsp;&nbsp; p=0; <br/>} </font></p>
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2009-2-25 13:46:43 | 显示全部楼层
指针,指针.........一不注意就指到火星去了[em52]
我就是嗷嗷叫的老马了......

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表