C++指针悬挂问题

Classyyy 2017-09-17 01:13:33

#include <iostream>
using namespace std;
class point
{
public:
static int number;
public:
point()
{number++;}
~point()
{number--;}
};
int point::number=0;
int main()
{
point* ptr;
point* pp=new point[3];
cout<<point::number<<endl;
ptr=pp;
delete[] ptr;
return 0;}


我想问一下main()函数里面,delete[] ptr; 释放了ptr指针,那么一开始 ptr=pp;说明ptr=pp指向同一个空间,这个时候ptr指针所指向的空间被删除(释放),那么另外一个指针pp是否成为了空指针,或者说是造成了悬挂指针问题呢?谢谢各位大神。
...全文
923 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
乐翔K 2018-01-13
  • 打赏
  • 举报
回复
是野指针,又叫指针悬挂。 比如: int *a = NULL; a = new int[5]; delete[] a; // 这个时候,a还不是NULL,但是a指向的内存已经被清理了,再去使用a,会出问题。 a = NULL; // 这个时候,才将a变为NULL 你的问题,相当于a在new以后,,,又赋值给指针b了 delete以后,b也同a一样,只是指向的内存块被清理了,指针本身没变化。 恩,就酱。
fuckguidao 2018-01-13
  • 打赏
  • 举报
回复
ptr与pp指向的空间被销毁了,但pp中存的地址没有被销毁,pp中存的是一串无用的地址,
零隐 2017-09-29
  • 打赏
  • 举报
回复
野指针,个人建议,释放堆之后,要赋值为空,避免不必要麻烦。
C艾斯蒂嗯蟹 2017-09-28
  • 打赏
  • 举报
回复
正确的写法应该是:

delete []ptr;
ptr = nullptr;
pp = nullptr;
或者把ptr和pp换成智能指针

shared<point> ptr(new point[3](),  default_delete<MyClass[]>())
但是智能指针不能识别你new出来的是不是数组,所以需要告诉它用数组的方式去删default_delete<MyClass[]>()
赵4老师 2017-09-18
  • 打赏
  • 举报
回复
其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
  • 打赏
  • 举报
回复
引用 楼主 weixin_40280062 的回复:

#include <iostream>
using namespace std;
 class point
 {
 public:
	 static int number;
 public:
	 point()
	 {number++;}
	 ~point()
	 {number--;}
 };
 int point::number=0;
 int main()
 {
	 point* ptr;
	 point* pp=new point[3];
	 cout<<point::number<<endl;
	 ptr=pp;
	 delete[] ptr;
	 return 0;}
我想问一下main()函数里面,delete[] ptr; 释放了ptr指针,那么一开始 ptr=pp;说明ptr=pp指向同一个空间,这个时候ptr指针所指向的空间被删除(释放),那么另外一个指针pp是否成为了空指针,或者说是造成了悬挂指针问题呢?谢谢各位大神。
这种情况就是多次引用了,一处释放了,所以C++引入了智能指针。
xiaohuh421 2017-09-18
  • 打赏
  • 举报
回复
野指针(悬挂指针)的产生, 就是 指针指向的内存无效了. 所以野指针, 也可以称为, 无效的指针.
xiaohuh421 2017-09-18
  • 打赏
  • 举报
回复
delete[] ptr; 释放了ptr指针, 这里说错了 并不是释放指针, 它是释放指针指向的内存. 这里ptr没有置空的话, ptr本身也会变成一个野指针(悬挂指针). 其它指向这块内存的指针, 也全都变成野指针了.
Chen_QiDian 2017-09-18
  • 打赏
  • 举报
回复
ptr=pp; 之后可以认为ptr与pp是同一个东西,不同的名字而已。 所以ptr与pp只能释放一个,而且只能一次。
xiaohuh421 2017-09-18
  • 打赏
  • 举报
回复
你还没有理解到我说的. delete[] ptr; 这样的操作, 仅是释放内存,内存,内存, 跟指针无关, 指针仍然指向那个已经释放掉的内存的地址. 所以你问是否还要delete[] pp; 就是没有理解到, 因为内存只需要, 也只能释放一次, 多次释放也会出错. 对于指针本身, 一般是设置成NULL 所以一般delete指针后, 都要习惯性的加一句置成null的操作. delete[] ptr; ptr=NULL;
赵4老师 2017-09-18
  • 打赏
  • 举报
回复
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
Classyyy 2017-09-18
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
谢谢
引用 2 楼 xiaohuh421 的回复:
delete[] ptr; 释放了ptr指针, 这里说错了 并不是释放指针, 它是释放指针指向的内存. 这里ptr没有置空的话, ptr本身也会变成一个野指针(悬挂指针). 其它指向这块内存的指针, 也全都变成野指针了.
那么你的意思说这样的结果是造成了指针悬挂吗?是否要增加delete [] pp;谢谢。
Classyyy 2017-09-18
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
谢谢
大米粥哥哥 2017-09-17
  • 打赏
  • 举报
回复
是啊 指向的内存被释放了当然变成悬挂指针了

64,637

社区成员

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

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