c++中delete与NULL的效果

南野猎人 2014-11-06 03:15:36
对一个指针来说,使用delete与NULL的效果,前者是释放指针指向的内存空间,而后者是释放指针所在的内存。我的这种看法对吗?求高手指导
...全文
699 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
版主大哥 2014-11-06
  • 打赏
  • 举报
回复
引用 12 楼 moonleader 的回复:
我知道了,一般new与delete成对使用,我改写了一下就可以了: int *p=new int; delete p; p=NULL; cout<<p<<<endl; 输出为00000000 我想知道为什么,这么写就报错了: int a=10; int *p=&a; delete p; p=NULL; cout<<p<<endl; new与delete应该成对出现的原因是什么?难道是不可以随便释放一个指针指向的内存?如果是这样的话,什么样的只能可以用delete来释放其指向的内存空间呢?
搜索 “堆和栈”
linux_hsylar 2014-11-06
  • 打赏
  • 举报
回复 5
一般delete和new是成对出现的,new是在堆上申请内存空间,new的返回值是对应一个指针p,指针里面存的是new申请空间的首地址;delete([]) p会将p在堆空间上申请的内存块释放掉;但是此时p指针里面存的地址还是存在的,一般delete完,需要使用 p=NULL,这样做就是防止野指针的出现,这样p里面存的值就是地址就是0x00000000(NULL的地址) 下面的那道题就知道原因了吧: int a=10; int* p=&a; delete p;这句你用了delete,编译器就会认为你p里面存的地址是在堆空间,但是p里面的地址是a的地址,a在栈空间,怎么释放栈空间中的内存,肯定会出错。 delete 后面跟的指针,这个指针指向的空间必须在堆空间上才能释放。
南野猎人 2014-11-06
  • 打赏
  • 举报
回复
我知道了,一般new与delete成对使用,我改写了一下就可以了: int *p=new int; delete p; p=NULL; cout<<p<<<endl; 输出为00000000 我想知道为什么,这么写就报错了: int a=10; int *p=&a; delete p; p=NULL; cout<<p<<endl; new与delete应该成对出现的原因是什么?难道是不可以随便释放一个指针指向的内存?如果是这样的话,什么样的只能可以用delete来释放其指向的内存空间呢?
版主大哥 2014-11-06
  • 打赏
  • 举报
回复
引用 10 楼 moonleader 的回复:
去掉[ ],同样会报错,既然p=NULL,为什么输出p会报错呢?不应该输出全0么?
将int a=10; int* p = &a; 改成int* pA = new int; int* p = pA;
南野猎人 2014-11-06
  • 打赏
  • 举报
回复
去掉[ ],同样会报错,既然p=NULL,为什么输出p会报错呢?不应该输出全0么?
版主大哥 2014-11-06
  • 打赏
  • 举报
回复
并且还delete[]
版主大哥 2014-11-06
  • 打赏
  • 举报
回复
new是堆上的空间,delete也是 栈上的空间用delete 楼主去好好补补
版主大哥 2014-11-06
  • 打赏
  • 举报
回复
delete 临时变量.....
南野猎人 2014-11-06
  • 打赏
  • 举报
回复
感谢二楼的回答,我还有点疑问,见下面的图片,这个为什么会报错,而不是输出全0呢?
mujiok2003 2014-11-06
  • 打赏
  • 举报
回复
引用
而后者是释放指针所在的内存
no, 这是个普通赋值语句而已,与
int a; a = 0;
并无本质不同。
版主大哥 2014-11-06
  • 打赏
  • 举报
回复
new是跟系统借一块内存,成功的话,系统给你一块内存,并且系统会保证不会把你分配的内存给其他申请到 delete是跟系统还一块内存,成功的话,系统会让其他人可以分配到这块内存 而new和delete的内存内容系统是不关心的,所以一般malloc后,都会初始化内存 释放内存是没有改变内存内容 指针是指向那块内存,申请到了内存就会指向那块内存,跟内存内容没有关系 如: int* pInt = new int; pInt = NULL; //这里跟分配的内存没关系,只是将pInt这个指针指向NULL而已 (这里由于没有delete会内存泄漏)
乐哉悠哉 2014-11-06
  • 打赏
  • 举报
回复
使用 delete 释放指针指向的内存。但这时候指针仍然存在,但由于原来它指向的内存已经被 delete 释放,所以它变成了野指针,于是需要让它指向 NULL。
勤奋的小游侠 2014-11-06
  • 打赏
  • 举报
回复
后者是错误的。指针是一个变量。p=NULL.只是相当于将p=0.即将0值赋给了这个变量。并没有释放这个指针的内存,只是改变这个这指针的值为0而已。
robertbo 2014-11-06
  • 打赏
  • 举报
回复
delete 是释放空间,NULL是为了防止后面的程序误使用到账内存访问错误的

65,187

社区成员

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

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