c++删除指针的问题

#include<iostream>
using namespace std;
class human
{
public:
human(){cout<<"构造";}
int can(){x=4; return x;}
private:
int x;
};
int main()
{
(1) human *p=new human;
(2)delete p;
(3)p=0;
(4)delete p;
(5)p=new human;
return 0;
}
第(2)释放了指针所指向的内存空间,第(4)将指针删除,为什么(5)还能使用这个指针,(4)不是已经把指针删除了吗?

new  delete不是字面意义上的新建和删除

new表示申请内存

delete表示释放内存(退还,归还给系统)

这是一对组合命令

(1) human *p=new human;  声明一个指针变量p,并分配空间
 (2)delete p;            释放p,释放后,p原来指向的内存空间不再为本程序所用,但变量p还是有效的,可以用,如(3)
 (3)p=0;                 给变量p赋值为0
 (4)delete p;            这句有问题了,当p没有指向任何内存空间时,进行Delete操作有可能会出现系统异常
 (5)p=new human;         这里再次申请一次内存空间,是允许的,p指向一个新的内存对象地址。
 return 0;

追问

书上写的,delete一个空指针是安全的。
我的意思就想问怎么删除指针,或者指针不能被删除?

追答

问怎么删除指针,或者指针不能被删除?

我希望您在问这个问题时,对”指针“这个词有清楚的认识!

我可以先问一下,您这里说的”指针“是什么意思呢?

追问

指针是保存地址的变量,我这里说的就是这个意思,我就是问怎么删除这个用来保存地址的变量

追答

声明一个变量后,这个变量其作用域所在生命期中,就会一直存在,只是你会不会再用它,由编程者确定。

int i;
for( i=0;i<100;i++ )
{
}
我们常用的循环变量,这个i,我们用过后,从来没有想过要不要去删除它。
为什么你想删除指针变量呢?
指针变量也只是一个普通变量,如果从数值角度而言,指针变量只不过是一个和int i中的i一样的一个存储整型数据的变量!因为地址值就是个无符号整数!

所以,不可能人工删除一个变量!变量的生存期,是由变量的类型和位置所决定的,由系统决定!

追问

懂了,我还想问一点,delete指针之后,要不要把指针赋为0啊?,书上写的要赋为0,但是他演示的程序最后又没有将指针赋0

追答

释放指针指向的空间地址后,最好是将指针变量值清为0,这样可以防止后续程序代码”误走到不该走的地方“,而出现程序BUG。还有一种情况是,我们一般写代码都会这样:(尤其在析构函数中)
写个简单例子
class test {
private:
char *p;
public:
test(){ p = 0;} //函数1
test( char *x) { p=new char [100] ; strcpy( p, x );} //函数2
~test(){

if ( p )
delete p ;
}
};
因为建立对象时,有可能调用函数1,也可能调用函数2,因此,在析构时,加上检查if(p)这样的检查,就可以防止重复释放造成的BUG

但我们一般程序,申请一个空间后,用过了delete 之后程序结束了,所以也可以不用将其赋值为0

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-09-11
(2)、delete p; // 释放了p指向的内存,大小由p的类型决定
(3)、p = 0; // p指向0(NULL)是安全的,是推荐用法
(4)、delete p; // 可能会出现问题,在VC ++ 6.0中,蜂鸣器会发声
(5)、p=new human; // 重新指向新的位置,没有问题。

第2个回答  2014-09-11
delete不是删除指针,是释放指针申请的空间,delete后指针申请的空间没有了,但指针还存在。追问

那怎么删除指针?还是说指针不能被删除?

追答

就像定义int a,你后面会删除它么不会,定义指针也是一样,他们都存在于栈中,程序结束后释放

追问

懂了,我还想问一点,delete指针之后,要不要把指针赋为0啊?,书上写的要赋为0,但是他演示的程序最后又没有将指针赋0

第3个回答  2014-09-11
p是个指针,其指向“内容”。
delete p;意味着销毁掉p指向的内容,而不是p本身。
p是一个变量,当然可以改变p的值,即可以改变p的指向,使其指向新的“内容”。
第4个回答  2014-09-11
delete实际意义不是删除指针,而是删除了指针指向的空间(分配的空间被释放了)
然后设定指针 p=0,相当于给指针置空(不指向其他地方)。
然后(5) 又给指针分配了空间,指针指向空间分配的地址。
相似回答