1: 野指针:未初始化的指针,其指针内容为一个垃圾数。指针在被定义的时候,如果程序不对其进行初始化的话,它会指向随机区域,因为任何指针变量(除了static修饰的指针变量)在被定义的时候是不会被置空的,它的默认值是随机的。随机的值可能是一个没有被分配使用的内存地址,也可能是操作系统的内存地址,之后如果再对这个未初始化的指针进行赋值,可能就会更改操作系统的数据,运行可能发生不可知的崩溃错误。
野指针是指尚未初始化的指针,既不指向合法的内存空间,也没有使用 NULL/nullptr 初始化指针。
2、悬空指针:指针正常初始化,曾指向过一个正常的对象,但是对象销毁了,该指针未置空。我们在用malloc开辟内存空间时,要检查返回值是否为空,如果为空,则开辟失败;如果不为空,则指针指向的是开辟的内存空间的首地址。指针指向的内存空间在用free()或者delete(注意delete只是一个操作符,而free()是一个函数)释放后,如果程序员没有对其置空或者其他的赋值操作,就会使其成为一个野指针。
悬空指针是指 指针指向的内存空间已被释放或不再有效。
3、指针操作超越变量作用域 。同2就是超过作用域的变量已经被释放,但是指针依然存在。不要返回指向栈内存的指针或引用,因为栈在函数结束的时候会被释放,此时指针指向的内存已经无效了,而指针没有被置空,引用一个非空的无效指针是一个未被定义的行为,可能会导致错误。野指针很难定位问题,调试较麻烦。
规避方法:初始化指针时将其置为NULL,之后再对其进行操作。
释放指针时将其置为NULL或0,最好在编写代码时将free()函数封装一下,在调用free()后就将指针置为NULL
void Free(void *p) {
if (p != NULL) { // 在使用时对指针的合法性的判断
free(p);
p = NULL; // 调用free()后就将指针置为NULL
}
}
小结:
悬空指针是指已经释放掉的内存指针。调用free(p)时,p指向的内存被释放了。p指针本身仍然存在。它指向的内存仍然是有效的,你可以继续读写p指向的内存,但是释放掉的内存可能会被内存管理器重新分配,此时,p指针指向的内存已经被赋予新的意义,已经不是原来想要的数据。对它的访问是不可预料的。
指针使用相关技术:
野指针的产生及其危害 - 小心眼儿猫的博客 - CSDN博客
空悬指针和野指针(Dangling pointer and wild pointer) - drunknbeard - 博客园
OC中给空对象发送消息程序会Crash吗?_学海无涯苦作舟-CSDN博客 nil & Null , NSNull 的区别。