空悬指针和野指针(Dangling pointer and wild pointer)

空悬指针
简单地说,空悬指针是对象的指针的生存周期比对象更长所导致的,也就是说,对象销毁、删除了,不存在了,指针仍然存在,这时这个指针就成了空悬指针。
当对象被析构、删除时,如果指向它的指针没有被同时修改,那么指针仍然会指向那块内存(但是那块内存已经没有东西了)。系统此时可能会重新分配这块已经free掉的内存,如果程序再通过这个指针读这块内存,就可能会有不可预见的事情发生,因为这块内存可能被分配了完全不同的内容。如果程序此时要写这块内存,就可能会造成数据污染,进而可能带来超级难被发现的bug。如果内存已经被其它进程重新分配,此时再去访问指针指向的内容,就可能会发生片段错误(UNIX,Linux)或者一般性保护错误(Windows).如果程序有足够的权限去重写内核内存分配器的内容,还可能造成系统的不稳定。在有垃圾回收机制的面向对象语言中,阻止空悬引用的方法是销毁所有访问不到的对象,也就是说他们也就没有所谓的指针了,这是由追踪或引用计数而确保的。然而finalizer可能会创建新的对象的引用,这就要求对象要再生来防止空悬引用。

野指针作为一个指针,甚至都没有被初始化,也就是说虽然它的类型是一个指针,但它根本没有值。它跟NULL指针还有差别,NULL是指向了0地址,而野指针是没有地址。也就相当于,int a=0;和int a;的区别。

以下举例说明:

{
   char *dp = NULL;
   /* ... */
   {
       char c;
       dp = &c;
   }  
//到这里,c已经被销毁了,dp就变成了空悬指针
}
#include <stdlib.h>

void func()
{
    char *dp = malloc(A_CONST);
    /* ... */
    free(dp);         /* dp 现在是空悬指针 */
    dp = NULL;        /* dp 不再是空悬指针*/
    /* ... */
}
int *func(void)
{
    int num = 1234;
    /* ... */
    return &num;//返回了一个指针,但是指针指向的对象,在函数结束时已经销毁了
}

第三种情况我在这篇文章也有写。

猜你喜欢

转载自www.cnblogs.com/drunknbeard/p/9502171.html