杭州省建设厅网站,网页设计作业笔记,做游戏动画外包网站,wordpress商城 微信支付野指针目录1#xff1a;定义2#xff1a;野指针常见情形2.1 #xff1a;未初始化的野指针2.2 所指的对象已经消亡2.3 指针释放之后未置空3#xff1a;避免野指针1#xff1a;定义
指向非法的内存地址的指针叫做野指针#xff08;Wild Pointer#xff09;#xff0c;也…
野指针目录1定义2野指针常见情形2.1 未初始化的野指针2.2 所指的对象已经消亡2.3 指针释放之后未置空3避免野指针1定义
指向非法的内存地址的指针叫做野指针Wild Pointer也叫悬挂指针(Danging Pointer)意为无法正常使用的指针。
2野指针常见情形
2.1 未初始化的野指针
出现野指针最典型的情况就是在定义指针变量之后没有对它进行初始化如下面的程序。
#includeiostream
using namespace std;
int main(){int* p;// 编译通过运行时出错 error : Segment fault 信号错误cout *p endl;return 0;
}2.2 所指的对象已经消亡
指针指向某个对象之后当这个对象的生命周期已经结束对象已经消亡后仍然使用该指针访问该对象那么将会出现运行时错误。
#includeiostream
using namesoace std;
int* retAddr()
{int num 10;return num;
}
int main()
{int* p NULL;p retAddr();cout p endl;cout *p endl;
}上面程序在编译在编译的时候会报错
warning: address of local variable num returned [-Wreturn-local-addr]
表示函数内部定义的变量在函数结束时被释放掉所以返回是找不到的。2.3 指针释放之后未置空
指针p被 free或者 delete之后没有置为NULL这就是让人误以为是一个合法指针p.对指针进行 free或者 delete只是把指针所指的空间释放掉但并没有把指针本身置为空此时指针指向的就是垃圾内存所以释放后的指针应该立即置为NULL防止产生野指针。
#includeiostream
using namespace std;
int main()
{int* p NULL;p new int[10];delete p;cout p[0]: p[0] endl;
}打印结果 p[0]:13511344
很显然打印结果是一个随机值因为此时指针所指的空间是一个垃圾内存存放着随机值。3避免野指针
综述所知 野指针有时比较隐蔽编译器不能发现为了防止野指针带来的危害开发人员应该注意以下事项。
C引入了引用机制如果使用引用可以达到编程目的那么可以不用使用指针因为引用在定义的时候 必须初始化这样可以避免野指针的出现如果一定要是使用指针 那么需要在定义指针的时候同步进行初始化操作定义时将其置为NULL或者指向一个有名的变量。对指针进行 free或者delete操作后将其设置为 NULL。对于使用 free情况常常定义一个宏或者函数 xfree来代替free置空指针。
#define xfree(x) free(x); x NULL;