空悬指针和野指针(Dangling pointer and wild pointer)
Posted drunknbeard
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了空悬指针和野指针(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 #//返回了一个指针,但是指针指向的对象,在函数结束时已经销毁了
}
第三种情况我在这篇文章也有写。
以上是关于空悬指针和野指针(Dangling pointer and wild pointer)的主要内容,如果未能解决你的问题,请参考以下文章