野指针:
就是没有被初始化过的指针或者指向受限访问的指针(不给用户访问)
如何防止野指针:
初始化指针nullptr
悬空指针:
指针最初指向的内存已经被释放了的指针,虽然指针指向的对象已经释放,但是指针本身还是没有释放。
下述例子中,p2就是一个悬空指针
#include <stdlib.h>
int main(int argc, char *argv[])
{
int *p1 = (int *)malloc(sizeof (int));
int *p2 = p1; /* p2 and p1 are pointing to the same memory */
free(p1); /* p1 is a dangling pointer, so is p2 */
p1 = NULL; /* p1 is not a dangling pointer any more */
return (*p2 & 0x7f); /* p2 is still a dangling pointer */
}
如何防止悬空指针:
智能指针或者在释放指针前判断指针是否为空,不为空再释放。```
总结:
无论是野指针还是悬空指针,都是指向无效内存区域(这里的无效指的是"不安全不可控")的指针。 访问"不安全可控"(invalid)的内存区域将导致"Undefined Behavior"。也就是说:任何可能都会发生。要么编译失败,要么执行得不正确(崩溃(e.g. segmentation fault)或者悄无声息地产生不正确的执行结果),或者偶尔会正确地产生程序员希望运行的结果。
参考文章:
https://www.cnblogs.com/idorax/p/6475941.html