野指针首先他不是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,这样,这块内存并不属于编译器,他是属于某个变量的合法访问区域,但是这个访问的指针已经不存在了,这样子这块内存就像是一个洞一样,得名曰内存“黑洞”。