C++学习之指针的常见错误
我们在编程的过程中,有时候在使用指针的时候,删除一个指针以后一定要将这个指针设置为空指针,这是因为删除这个指针只是删除这个指针指向的地址,这个指针还真是的存在程序中,并且它仍然会指向原来的内存空间。这时候如果你忘记了这点而再次尝试使用这个指针的时候,那么将会导致程序出错。
这种错误非常难于调试,因为这种值得改变不太容易使人联想到时被删除的安格指针导致的错误,因此在删除一个指针以后,我们一定要将它赋值为空,虽然使用空指针的时候是违法的,容易使程序崩溃,但是,有时候我们宁愿让程序崩溃也不愿意调试这种难于觉察的错误。
这种隐藏的错误可以从下面这个例子中体现出来:
#include<iostream>
using namespace std;
int main()
{
int *p=new int;
*p=4;
cout<<"将4赋给p的地址以后,指针p读取的值: "<<*p<<endl;
delete p;
cout<<"删除P指向的空间以后,指针p读取的值为: "<<*p<<endl;
long *p1=new long;
cout<<'创建新空间以后,指针p1中保存的地址: "<<p1<<endl;
*p1=12423;
cout<<"指向新空间以后,指针P1中保存的地址为:"<<p1<<endl;
*p=23;
cout<<"将23赋给p的地址以后,指针p读取的值: "<<*p<<endl;
cout<<"将23赋给p的地址以后,指针p1读取的值: "<<*p1<<endl;
delete p1;
return 0;
}
运行这个程序,会发现指针p和p1读取的值都为23,由于编译器会默认将释放掉的内存空间回收然后分派给新开辟的空间,因此的10行新定义了指向新开辟的long型变量空间的指针p1以后,这个p1指针指向的空间实际上就是被释放的空间,也就是P原来指向的空间,这种错误非常之难调试,因为这种值的改变不容易令人联想到的是被删除的那个指针导致的错误,因此在删除一个指针以后,一定要将其赋值为空,虽然使用空指针是违法的,容易使程序奔崩溃,但是我们宁愿程序崩溃,也不愿意它调试起来很困难。