一个小疑问

ljq550000 2011-06-22 01:10:19
#include <iostream>

using namespace std;

class A
{
public:
A(int i)
{
n = i;
}

void show()
{
cout << n << endl;
}
private:
int n;
};

int main()
{
A *a = new A(1);
A b = *a;
delete a;
b.show();

return 0;
}

为什么会正常打印1呢 指针已经被删除了啊

...全文
86 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ryfdizuo 2011-06-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ljq550000 的回复:]

引用 11 楼 pwxcomer 的回复:

指针a删除了,但是对象b还存在啊,所以b.show();可以显示啊


内存不是不能在被修改了么
[/Quote]
可以被覆盖重写的
ljq550000 2011-06-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 pwxcomer 的回复:]

指针a删除了,但是对象b还存在啊,所以b.show();可以显示啊
[/Quote]

内存不是不能在被修改了么
pwxcomer 2011-06-22
  • 打赏
  • 举报
回复
指针a删除了,但是对象b还存在啊,所以b.show();可以显示啊
ljq550000 2011-06-22
  • 打赏
  • 举报
回复
自己up下
ljq550000 2011-06-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 babilife 的回复:]

看到此类问题,我比较敏感了,呵呵
A b = *a;//调用默认拷贝构造函数---即浅拷贝
delete a;//虽然删除了,只是指针无法使用了,再用就是野指针了,但地址里内容依然保存这
b.show();//所以,可以正常显示1
[/Quote]

我测试过了 我用b仍然可以访问这块地址 并且修改里面的内容也不会有问题 求解
至善者善之敌 2011-06-22
  • 打赏
  • 举报
回复
看到此类问题,我比较敏感了,呵呵
A b = *a;//调用默认拷贝构造函数---即浅拷贝
delete a;//虽然删除了,只是指针无法使用了,再用就是野指针了,但地址里内容依然保存这
b.show();//所以,可以正常显示1
abc10011001 2011-06-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lxyppc 的回复:]
这个例子中楼主写的是一个合法的程序
在A b = *a;这一行,a对象已经赋值给了b对象(通过自动生成的拷贝构造函数)。
此后再delete 掉a对b不会产生影响。
所以b.show可以正常执行。
[/Quote]

支持
luciferisnotsatan 2011-06-22
  • 打赏
  • 举报
回复
google 野指针
动感超哥 2011-06-22
  • 打赏
  • 举报
回复
只是删除指针 还是可以访问的
lxyppc 2011-06-22
  • 打赏
  • 举报
回复
这个例子中楼主写的是一个合法的程序
在A b = *a;这一行,a对象已经赋值给了b对象(通过自动生成的拷贝构造函数)。
此后再delete 掉a对b不会产生影响。
所以b.show可以正常执行。
就想叫yoko 2011-06-22
  • 打赏
  • 举报
回复
delete 把 堆上申请的空间标记为已删除
在一下new之前 不应该再去取这个地址里面的值
西部流云 2011-06-22
  • 打赏
  • 举报
回复
楼上说的很对
bdmh 2011-06-22
  • 打赏
  • 举报
回复
delete不是说指针已经不存在了,是悬垂指针,在没有被改写之前,可以访问,如果你加上 a = NULL,就不能访问了

64,685

社区成员

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

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