new和delete 类对象问题

RandnYC 2017-07-27 10:19:17

#include <iostream>
using namespace std;

class A{
public:
int x;
A(int i) : x(i) {}
};

int main(){

A *a=new A(10);

delete a;

cout<<a->x<<endl;

return 0;
}


请教一下为什么delete掉指针指向的对象空间后 , 还是能访问到对象里的成员
...全文
195 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-07-28
  • 打赏
  • 举报
回复
其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
kakabulusi 2017-07-28
  • 打赏
  • 举报
回复
delete只是回收了该内存区,使得其他地方可以重新申请到该内存区。至于回收后内存区内的值,是随机的,不可预测。 一般情况下,delete 与 p=NULL 是搭配使用,delete掉之后,直接将该指针归零,防止对该内存区域的访问。
jena_wy 2017-07-28
  • 打赏
  • 举报
回复
因为在内存中这块内存还是存在的,并没有被其他的东西占用。
ckc 2017-07-28
  • 打赏
  • 举报
回复
删除只是的操作系统回收已经分配的内存,下次可以继续分配给别人使用 这块内存还是存在,里面的东西也还是存在 这个时候再去访问它结果应该是不确定的, 如果操作系统允许你访问,那就可以访问到原来的信息,如果这块内容还没有被别的进程申请并且修改的话 如果操作系统不允许你访问没有分配的内存什么的,那就会报错
战在春秋 2017-07-28
  • 打赏
  • 举报
回复
这么写编译不报错,但运行时会出错。
A *a=new A(10);
delete a; //执行这行之后,a本身的值不会变,但不再允许使用该指针访问内存。
合适的写法是:
A *a=new A(10);
delete a; 
a = NULL;

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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