野指针
指向”垃圾“内存的指针称为野指针。
产生原因
- 指针变量没有初始化。
int* a;
*a = 123;
编译:
- 已经不用的指针变量没有置为NULL。通常是使用delete或free后的指针没有被置为NULL。
- 调用delete后未置为NULL。
char* p = (char*)malloc(10);
cout << p << endl;
delete(p);
cout << p << endl;
结果:
最后问题回到了1,指针变量没有初始化。
- 调用free后没有置为NULL。
char* p = (char*)malloc(10);
cout << p << endl;
free(p);
cout << p << endl;
if (p != NULL) {
cout << "野指针" << endl;
}
编译:
调用free后,问题同样回到了问题1,指针变量没有初始化。通过编译会发现free后,只是前后输出的内容不同,说明释放的只是指针指向的内存,而指针本身并没有被释放,且使用p != NULL判空无效,说明指针指向无用的地方,也就成为了野指针。
- 指针的操作超出了变量的作用域。
int* p;
for (int i = 0; i < 2; ++i)
{
p = &i;
}
cout << i << endl;
cout << *p << endl;
p在循环内被赋值,但i的作用域在循环内,但在循环外输出p时,i已经无效,所以此时虽然指针仍有指向,但指向的内容不存在了,所以指针的指向超出了i的作用域,属于垃圾内容。
如何避免
没有初始化、已经被释放的、超出作用域的统统置为NULL.。