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

原文链接:http://blog.csdn.net/zlhy_/article/details/8794969

野指针首先他不是 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、付费专栏及课程。

余额充值