迷途(stray)指针,也被称为野(wild)指针或悬浮(dangling)指针,是指将delete 用于指针(从而释放它指向的内存),但没有将它设置为空时引发。如果随后你在没有重新赋值的情况下使用该指针,后果将是不可预料的:程序崩溃算你走运。
指针指向堆空间,delete之后,只是回收内存。并不改变指针的值。
再删除一个指针之后,一定要将其赋值为空。虽然使用空指针是非法的,容易使程序崩溃,但是我们宁愿使程序崩溃也不远使程序调试起来很困难。
如下例:
#include <iostream>
using namespace std;
int main()
{
int *p=new int;
*p=3;
cout<<"将3赋给p的地址后,指针p读取的值:\t"<<*p<<endl;
delete p;
p=0;
//cout<<"删除空间后,指针p读取的值:\t\t"<<*p<<endl;
long *p1=new long;
cout<<"创建新空间后,指针p中保存的地址:\t"<<p<<endl;
*p1=999999;
cout<<"指向新空间的指针p1保存的地址:\t\t"<<p1<<endl;
p=new int;
*p=23;
cout<<"将23赋给p的地址后,指针p读取的值:\t"<<*p<<endl;
cout<<"将23赋给p的地址后,指针p1读取的值:\t"<<*p1<<endl;
delete p1;
return 0;
}
using namespace std;
int main()
{
int *p=new int;
*p=3;
cout<<"将3赋给p的地址后,指针p读取的值:\t"<<*p<<endl;
delete p;
p=0;
//cout<<"删除空间后,指针p读取的值:\t\t"<<*p<<endl;
long *p1=new long;
cout<<"创建新空间后,指针p中保存的地址:\t"<<p<<endl;
*p1=999999;
cout<<"指向新空间的指针p1保存的地址:\t\t"<<p1<<endl;
p=new int;
*p=23;
cout<<"将23赋给p的地址后,指针p读取的值:\t"<<*p<<endl;
cout<<"将23赋给p的地址后,指针p1读取的值:\t"<<*p1<<endl;
delete p1;
return 0;
}
在删除p时,如果没有给其赋值为空的话(
p=0;),则编译器会默认将释放掉的空间收回然后分配给新开辟的空间。因此当新定义的指向新开辟的long型变量空间的指针p1,这个p1其实指向的是释放掉的空间,也就是p指向的空间。因此对指针p的操作会影响到p1所指向的值,并且这样的错误很难调试。
注意:delete某指针后,只是回收该指针所指向的空间,该指针的值不变。你可以手动将其赋为null。new的主要目的就是分配空间,而delete主要目的也正是回收空间。并不操作指针值,因此你delete p之后,再输出指针p的地址应该还是之前的地址,而值已经不再是你所赋的值。应该是一个无法预计的数,但是由于你还可以拥有该指针,因此你可以使用该指针给该空间赋值,这样可能会引起不必要的麻烦