野指针 不是 NULL
指针,而是指向 垃圾 内存的指针。
如果一个指针是 NULL
, 我们一般都能发现,因为 if
语句很容易判断和识别出来。
但野指针则不一样,它的危险在于 if
语句对它无效。
野指针的成因有三种,记住它们则能避免 99.99% 的野指针:
-
指针变量定义了但未初始化
指针变量在创建时并不会自动初始化为
NULL
指针。指针变量的缺省值(默认值)是随机的,会乱指一气。char *p; // p 未初始化,可能就是野指针了
因此,指针使用定理之一: 指针变量在定义时同时初始化。 那么自动赋值为
NULL
指针,要么指向其它合法的内存。 -
指针被
free
或delete
之后,并没有同时设置为NULL
。char *p = new char[10]; // 指向堆中分配的内存首地址 cin >> p; delete []p; // p 就变成野指针了
-
指针操作超越了变量的作用域范围.
charr *p = new char[10]; // 指向堆中分配的内存首地址 cin >> p; cout << *(p+10) // 可能输出的数据未知
因此,为了避免野指针出现,我的最佳实战是:
-
初始化时指向
NULL
然后再赋值char *p = NULL;
-
释放时同时指向
NULL
delete []p; p = NULL;
-
分配成功后要检查是否分配成功
char *p=new char[10]; if(p==NULL) return;
目前尚无回复