野指针相关概念
2019-03-21 本文已影响0人
奥斯特洛司机
野指针主要是因为这些疏忽而出现的删除或申请访问受限内存区域的指针。
指针变量未初始化
任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。如果没有初始化,编译器会报错“ ‘point’ may be uninitializedin the function ”。
指针释放后之后未置空
有时指针在free或delete后未赋值 NULL,便会使人以为是合法的。别看free和delete的名字(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为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; ``// 注意 的生命期 ,只在这个函数Test中,而不是整个class B
}
void
Test1() {
p->Func(); ``// p 是“野指针”
}
};
|
函数 Test1 在执行语句 p->Func()时,p 的值还是 a 的地址,对象 a 的内容已经被清除,所以 p 就成了“野指针” 。