C中的野指针,C++中的迷途指针(失控指针或悬浮指针)都是不为NULL的指针,也不是指向常量的指针,而是指向“垃圾”内存的指针。“垃圾”的意思是未知区域、未知内存。
例如,当我们定义一个指针的时候:
void main()
{
int *p;
}
p的值为0xcccccccc。也就是说,任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱 指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。这也就是为什么我们在指针一开始创建时就给它赋一个值总是没有错的。
指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。free和delete只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。
迷途指针示例:
int main()
{
int *pInt = new int;
*pInt=10;
cout<<pInt<<endl;
cout<<"*pInt: "<<*pInt<<endl;
delete pInt; //pInt为迷途指针!
int *pLong = new int;
cout<<pInt<<endl;
cout<<pLong<<endl;
*pLong=90000;
cout<<"*pLong: "<<*pLong<<endl;
*pInt=20; //再次使用pInt!
cout<<"*pInt: "<<*pInt<<endl;
cout<<"*pLong: "<<*pLong<<endl;
delete pLong;
return 0;
}
我们发现程序出现了错误,原因是当我们用delete删掉pInt时,程序只是删除了pInt所指向的那段内存地址,该变量所指向的地址值并没有变。
转自http://www.cnblogs.com/CBDoctor/archive/2012/08/01/2618199.html