定义
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。
原因
野指针主要是因为这些疏忽而出现的删除或申请访问受限内存区域的指针:
-
指针变量创建时未初始化
任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,指针变量在创建的同时应当将指针设置为NULL,或使它指向合法的内存。如果没有初始化,编译器会报错“ ‘point’ may be uninitializedin the function ”。 -
指针 free 或 delete 后未置空
有时指针在 free 或 delete 后未赋值 NULL,此时只是把指针所指的内存释放了,但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为 NULL ,防止产生“野指针”。 -
指针操作超越变量作用域
不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。例:
class A
{
public:
void Func(void)
{
cout << “Func of class A” << endl;
}
};
class B
{
public:
A *p;
void Test(void)
{
A a;
p = &a; // 注意a的生命周期 ,只在这个函数Test中,而不是整个class B
}
void Test1()
{
p->Func(); // p 是“野指针”
}
};
//函数 Test1 在执行语句 p->Func()时,p 的值还是 a 的地址,对象 a 的内容已经被清除,所以 p 就成了“野指针”
规避
-
初始化时置 NULL
任何指针变量(除了 static 修饰的指针变量)刚被创建时不会自动成为 NULL 指针,它的缺省值是随机的。 -
释放时置 NULL
对于使用 free 的情况,常常定义一个宏或者函数 xfree 来代替 free 置空指针。