野指针的成因
野指针主要是因为这些疏忽而出现的: 当指针p指向的内存空间释放时,没有设置指针p的值为NULL。delete和free只是把内存空间释放了,但是并没有将指针p的值赋为NULL。通常判断一个指针是否合法,都是使用if语句测试该指针是否为NULL。例如: int *p=newint(6);delete p;// 应加入 p=NULL; 以防出错// ...if(p != NULL){ *p=7; cout << p << endl;}对于使用 free 的情况,常常定义一个宏或者函数 xfree 来代替 free 置空指针: #define xfree(x) free(x); x = NULL;// 在 C++ 中应使用 nullptr 指代空指针// 一些平台上的 C/C++ 已经预先添加了 xfree 拓展,如 GNU 的 libibertyxfree(p);// 用函数实现,例如 GitHub 上的 AOSC-Dev/Anthon-Starter #9:static inline void *Xfree(void *ptr) { free(ptr);#ifdef __cplusplus return nullptr;#else return NULL;#endif}q=Xfree(q);所以动态分配内存后,如果使用完这个动态分配的内存空间后,必须习惯性地使用delete操作符取释放它。