野指针,悬垂指针,垃圾内存,内存“黑洞”

野指针首先他不是NULL指针,其次他指向的内存是不合法的,这个不合法的内存俗称 “垃圾”内存。它产生的原因一个是在free或是delete后,没有及时将指针设置为NULL。野指针的检测也是很困难的,比如用if(0 == ptr)也是不行的,因为在free或是delete后ptr并没有被设置为NULL。关于为什么是(0 == ptr)而不是(ptr == 0),这一点建议去看Effective C++的好像是前5个条款。
 
悬垂指针和野指针虽然称呼上不同,但是其本质是一致的,成因也是相似的。当多个指针指向一块内存时,对其中的一个指针施加了free或是delete后,即使把这个指针设置为了NULL,可是其余的指向这块内存的指针也是指向了 不合法内存的。取名为 悬垂指针,悬垂引用也是这个道理。
 
垃圾”内存这个词是对某个指针说的, 说某某指针访问了垃圾内存,就是访问了不合法的内存,也就是指针没有访问这块内存的权限,目前 内存的使用权限在于编译器,就像是把一个指针free或是delete后没及时显示的手动的将其设置为NULL。因为C/C++的机制原因,free和delete只是回收了指针所指向的内存,将这块内存的使用权限 收归编译器所有,但是free和delete的内部实现中并没有将指针自动设置为NULL,这就是垃圾内存与野指针的成因。垃圾内存与野指针,悬垂指针的检测很困难,因为编译器并不知道某个指针所指向的内存是否合法。尽量避免这些问题,一个方法就是使用智能指针。关于这一点的讨论与代码示例请参考一篇博文:点击打开连接
 
内存 “黑洞”是和上面三个完全不同的概念,在没有对一个指针施加free或是delete前就把这个指针设置为了NULL,这样,这块 内存并不属于编译器,他是属 于某个变量的合法访问区域,但是这个访问的指针已经不存在了,这样子这块内存就像是一个洞一样,得名曰内存“黑洞”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值