new 和 delete

ganwg07 2008-09-08 07:38:13
问题一:
请问一下,new 与 delete 为相互匹配使用,这里有一段代码

#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int n(200);
int* p=new int(100);
double* q=new double(11.1);
cout<<p<<" "<<*p<<endl;
cout<<q<<" "<<*q<<endl;
delete p; p=NULL; //这里用p=NULL,是为了初始化指针
delete q; q=NULL;
cout<<"after delete"<<endl;
cout<<p<<endl; //这里的 p ,q 就为已经初始化了的值
cout<<q<<endl;
return 0;
}
请问一下,我这里的p,q 是所指向的空间释放了,还是怎么理解?
在我不写 delete ,一样的申请了空间之后,我将 p=NULL,不是
一样可以初始化所用的指针么。
如果说 我所申请的空间是释放了,那么我不 delete ,只用将 p=NULL,不是也行么。
换句话说,这里的 指针p ,与释放了空间 delete p, 与将 p=NULL 这三者的关系是怎样的啊
请说说,谢谢了!
...全文
93 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
j60014589 2008-09-09
  • 打赏
  • 举报
回复
楼主要知道P也是一个变量,存在变量中的是一个地址。delete指令将这个地址上的内存释放(格式化)了,而p=NULL则是将这个变量中存的地址改写为0.
疯哥哥 2008-09-08
  • 打赏
  • 举报
回复
p = NULL:这只是初始化指针变量,将指针p指向一个"空地址".
delete p:释放p所指向的内存.

你当然可以不delete p;就把p=NULL;但是p在初始化以前(设为NULL之前的那个指针)所指向的那块内存就泄漏了,因为你没有释放那块内存.

初始化只是初始化指针的值,跟指针所指向的内存空间没有关系.
machaoqun6666 2008-09-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Wolf0403 的回复:]
假设有一个巨大的柜子,里面每个格子都有一个编号。
new double(11.1) 相当于你向这个柜子的管理员申请了一个格子,管理员告诉你这个格子的号码。
double *q = new double(11.1) 相当于你把管理员告诉你的号码写在一张纸上。
q = NULL; q = new double(12); 这些操作,都相当于你把原来纸上的数字擦掉,重新写了一个数字。但是,这个数字对柜子管理员来说是非法的,他并没有授权你使用这个号码;而原来给你分配的格子就一直…
[/Quote]
经典!形象!
Seanear 2008-09-08
  • 打赏
  • 举报
回复
比如:int* p=new int(100);
那么p所指向的空间不会被其他的申请所占用(这个空间设为A),(*p)调用合法.
p=NULL;只是把p置0,但空间A没有被释放,且没有指针指向它,A将无法被delete释放而成为系统垃圾.
delete p;使p所指向的空间A被释放,被释放的A空间又可以被其他的new等申请占用,
这时调用(*p)会报错,因为p指向的空间使用非法.
cutezjun 2008-09-08
  • 打赏
  • 举报
回复
楼上比喻的太经典了~~~~~我觉得可以写进教科书!!
Wolf0403 2008-09-08
  • 打赏
  • 举报
回复
假设有一个巨大的柜子,里面每个格子都有一个编号。
new double(11.1) 相当于你向这个柜子的管理员申请了一个格子,管理员告诉你这个格子的号码。
double *q = new double(11.1) 相当于你把管理员告诉你的号码写在一张纸上。
q = NULL; q = new double(12); 这些操作,都相当于你把原来纸上的数字擦掉,重新写了一个数字。但是,这个数字对柜子管理员来说是非法的,他并没有授权你使用这个号码;而原来给你分配的格子就一直浪费了。
delete q 相当于你回去告诉管理员,ok 这个格子我不需要了,你可以重新分配了。
ganwg07 2008-09-08
  • 打赏
  • 举报
回复
这个问题有点难度
机智的呆呆 2008-09-08
  • 打赏
  • 举报
回复
delete p,是指把p所指向的内存标记为可用,也就是说这些内存可以再被分配,p虽然还指向这块内存,但这时通过p访问这快内存已是不合法,所以一般delete p后要p=0;
double* q=new double(11.1);,通过p引用了堆上的一块内存,如果不先delete而直接p=null的话,如果只有p指向这块内存的话,这块内存在程序的运行过程一直不会被释放,也就是产生所说的内存泄漏

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧