浅拷贝的问题

czx10224 2008-03-21 07:03:14
#include <iostream>
using namespace std;

class A
{
public:
A(int *p):ptr(p){}
void set_ptr_val(int val)const {*ptr = val; cout << ptr << endl;}
private:
int *ptr;
};
int main()
{
int *p = new int(42);
A pt(p);
delete p;
int *pp = NULL;
{
int a = 42;
pp = &a;
cout << *pp << endl;
}
cout << *pp << endl;
pt.set_ptr_val(1);
cin.get();

}
上面这段代码有错?
p和ptr指向同一块内存单元,delete p后该块内存会被系统回收,那么ptr指针成为悬垂指针,pt.set_ptr_val(1);是否会有问题?a和pp也对应同一块内存单元,a是局部变量超出作用域后释放,那么pp指针是否指向不明?
...全文
127 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jieao111 2008-03-23
  • 打赏
  • 举报
回复
释放内存的本质是内存的所有权,



野男孩 2008-03-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 czx10224 的回复:]
可以不可以这么理解?

a是局部变量超出作用域自动释放,释放的只是变量,它所指向的那块内存也即现在pp指向的,
该内存没变化,所以操作pp是可以的。
[/Quote]

没错,就是这样的。能明白释放内存的本质是内存的所有权,而不是内存的值,就算是对内存管理入门了。

那个pt也是典型的内存访问有问题,只是没有爆发出来。
czx10224 2008-03-21
  • 打赏
  • 举报
回复
可以不可以这么理解?

a是局部变量超出作用域自动释放,释放的只是变量,它所指向的那块内存也即现在pp指向的,
该内存没变化,所以操作pp是可以的。
星羽 2008-03-21
  • 打赏
  • 举报
回复
都有问题,但不一定回马上暴露马上出错
ttkk_2007 2008-03-21
  • 打赏
  • 举报
回复

但我感觉ptr已经成为悬垂指针了,为何运行也没问题?
//////////////////////////////////////
成为悬垂指针可不一定就会出问题,那块内存只是被回收了,里面内容是undefined,你对他操作,行为未定义,可不一定会出错
ttkk_2007 2008-03-21
  • 打赏
  • 举报
回复

pt.set_ptr_val(1);是否会有问题?
//////////////////////////
肯定会有问题,因为ptr指向一块无效地址

a是局部变量超出作用域后释放,那么pp指针是否指向不明?
////////////////////////////////////////////
pp指向很明确,就是以前a的那块地址,只不过现在被回收了,你再用就有问题了
czx10224 2008-03-21
  • 打赏
  • 举报
回复
那段代码在devc上面运行是没有错的,
但我感觉ptr已经成为悬垂指针了,为何运行也没问题?
clhposs 2008-03-21
  • 打赏
  • 举报
回复
如果怕悬垂指针 可将指针赋0;

64,654

社区成员

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

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