c++删除指针的问题
#include<iostream>usingnamespacestd;classhuman{public:human(){cout<<"构造";}intcan(){x=...
#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)不是已经把指针删除了吗? 展开
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)不是已经把指针删除了吗? 展开
7个回答
展开全部
我同意一楼的说法 不过我运行正常哦 可能是编译器的关系
另外附上网友关于delete的说明
delete之后,下次再重新申请的时候可以再申请这块内存地址,也就是将这块地址放到了空闲链表上,对于这块地址的内容,没有进行清空处理(也没有必要);由于你没有将p赋为NULL,所以p指针还是指向这块内存空间。
如果不delete的话,你这块内存是不能在申请使用的,也就是所谓的内存泄露。
对于delete之后的指针p,此时是“野指针”。
一般的正确做法是:
int * p = new int ;
if (p == NULL)(千万不要忘了这句话!!!)
{
//判断是否为空!使用空指针是不对的!!
}
delete p;
p = NULL;(千万不要忘了这一句话!!)
希望能解决您的问题。
另外附上网友关于delete的说明
delete之后,下次再重新申请的时候可以再申请这块内存地址,也就是将这块地址放到了空闲链表上,对于这块地址的内容,没有进行清空处理(也没有必要);由于你没有将p赋为NULL,所以p指针还是指向这块内存空间。
如果不delete的话,你这块内存是不能在申请使用的,也就是所谓的内存泄露。
对于delete之后的指针p,此时是“野指针”。
一般的正确做法是:
int * p = new int ;
if (p == NULL)(千万不要忘了这句话!!!)
{
//判断是否为空!使用空指针是不对的!!
}
delete p;
p = NULL;(千万不要忘了这一句话!!)
希望能解决您的问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
显然 2 已经 释放 了 p 指向的 内存 (new申请的内存被释放)
4就是重复释放 将导致 程序 奔溃
delete p 是释放p指向的内存 p本身并没有变化
要说变化也就只是 不能再通过p访问它指向的内存数据
(失去了访问指向数据的权限)
p=0是改变p的指向 使其指向NULL
打个 比喻
你去宾馆(操作系统)开个房间 (new 了一块内存)你得到一个房间的钥匙(new出来的内存的地址)
当你 退房 (delete p)但是 没有 退还钥匙(p的值没变),从法律上说你就内有那个房间的使用全了,
但要是 你归还了钥匙 (p=NULL),那你就 真 进不了 你退掉的那个房间
4就是重复释放 将导致 程序 奔溃
delete p 是释放p指向的内存 p本身并没有变化
要说变化也就只是 不能再通过p访问它指向的内存数据
(失去了访问指向数据的权限)
p=0是改变p的指向 使其指向NULL
打个 比喻
你去宾馆(操作系统)开个房间 (new 了一块内存)你得到一个房间的钥匙(new出来的内存的地址)
当你 退房 (delete p)但是 没有 退还钥匙(p的值没变),从法律上说你就内有那个房间的使用全了,
但要是 你归还了钥匙 (p=NULL),那你就 真 进不了 你退掉的那个房间
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询