1、什么是野指针:
所谓野指针(wild pointer),简单讲是指指向不可用的内存区域的指针。需要注意的一点是,野指针与NULL空指针是不同的。NULL指针一般比较好判断,直接用if (p==NULL)语句判断即可。但是野指针是指向垃圾内存区域的指针,野指针会指向一段实际的内存,只是它指向哪里我们并不知情,或者是它所指向的内存空间已经被释放,所以在实际使用的过程中,我们并不能通过指针判空去识别一个指针是否为野指针。避免野指针只能靠我们自己养成良好的编程习惯。
2、哪些情况下会产生野指针?
- ①指针变量的值未被初始化: 声明一个指针的时候,没有显示的对其进行初始化,那么该指针所指向的地址空间是乱指一气的。
void func()
{
int *ptr; // 野指针
}
- ②指针所指向的地址空间已经被free或delete:在堆上malloc或者new出来的地址空间,如果已经free或delete,那么此时堆上的内存已经被释放,但是如果指向该内存的指针没有人为的修改过,那么指针还会继续指向这段堆上已经被释放的内存,这时还通过该指针去访问堆上的内存,就会造成不可预知的结果,给程序带来隐患,所以良好的编程习惯是:内存被free或delete后,指向该内存的指针马上置空。
void func()
{
int *ptr = new int[5];
delete []ptr;
// 执行完delete后,ptr变为了悬空指针(野指针的一种)
}
- ③指针操作超越了作用域:
void func()
{
int *ptr = nullptr;
{
int a = 10;
ptr = &a;
} // a的作用域到此结束
int b = *ptr; // ptr指向a,a已经被回收,ptr变为了野指针
}