c++primer里有关智能指针的一个疑问。
c++primer中文版第四版第422页,有一个图如下:我想问的是假如这里的执行deletep操作。那么对象U_Ptr的指针不也成了悬浮指针了吗?我没听明白你们两个说的,...
c++primer中文版 第四版 第422页,有一个图如下:
我想问的是假如这里的执行delete p 操作。
那么对象U_Ptr的指针不也成了悬浮指针了吗?
我没听明白你们两个说的,我知道智能指针是怎么回事。我只是想问如果这时候执行下列语句会不会出现悬浮指针。
int *p=new int(42);
Hasptr ptr(p,10);
delete p; 展开
我想问的是假如这里的执行delete p 操作。
那么对象U_Ptr的指针不也成了悬浮指针了吗?
我没听明白你们两个说的,我知道智能指针是怎么回事。我只是想问如果这时候执行下列语句会不会出现悬浮指针。
int *p=new int(42);
Hasptr ptr(p,10);
delete p; 展开
2个回答
展开全部
这书我看过了 C++沉思录 C++Primer 上面都提到智能指针 是这样的:U_Ptr这个类算是代理类吧(有时叫它句柄类 其实我也不知道为什么) 因为它有计数 计数的是有多少个对象是U_Ptr类代理的类(原始的) 每创建或者复制这种类型的对象 实际上在U_Ptr中的计数加1(有多少个原始的类类型的对象指向U_Ptr) 只有一个U_Ptr指向原始的类(或是别的) 注意:当U_Ptr中的计数为0时就是没有对象对向他 所以执行delete p 而代理类本身没有动态申请堆空间 释放的只是原始类(U_Ptr指向的)申请的空间 我觉得你没有弄清楚指针P和U_Ptr之间的区别
会的!P成为野指针 如果在访问P将出错 因为P指向的内存空间以不在 但P还是指向原来的地方啊…
会的!P成为野指针 如果在访问P将出错 因为P指向的内存空间以不在 但P还是指向原来的地方啊…
更多追问追答
追问
能不能说清楚点,我理解力差 呵呵
追答
噢 正好我的书柜有这书,是这样的,delete p 是释放p指针申请的空间,而U_Ptr的ip指针它并没有申请空间,不需担心它成为“野指针”
delete p
p=NULL
U_Ptr的作用只负责计数,计数的是有多少指向int类型对象(你上面的int型) 当只有一个对象指向U_Ptr时,它的计数为1,执行--ptr->use==0时,就没有对象指向它了,要释放P,也就是把这些工作交给U_Ptr
我也说的不清楚 但是我知道是什么回事 呵呵 你再仔细的看看书吧
展开全部
"delete p"的操作产不会引起"U_Ptr"的"ip"成为悬垂指针。
实际上Hasptr ptr(p,10)后,p所指的内存已经由ip来接收了,在这里p只量个中间临时的变量,
用来初始化HasPtr后就没用了否则程序,正应该delete p才对,完成后会造成内存泄漏。
只是ip接收p动态申请的内存也有个条件:
就是在HasPtr类的构造函数应该改为:
HasPtr(int *p,int i):ptr(new U_Ptr(new int(*p))),val(i) {}"
而不是这样:"HasPtr(int *p,int i):ptr(new U_Ptr(*p)),val(i) {}"(这是网上下来C++Primer代码)
后者在编译时会出现故障。
实际上Hasptr ptr(p,10)后,p所指的内存已经由ip来接收了,在这里p只量个中间临时的变量,
用来初始化HasPtr后就没用了否则程序,正应该delete p才对,完成后会造成内存泄漏。
只是ip接收p动态申请的内存也有个条件:
就是在HasPtr类的构造函数应该改为:
HasPtr(int *p,int i):ptr(new U_Ptr(new int(*p))),val(i) {}"
而不是这样:"HasPtr(int *p,int i):ptr(new U_Ptr(*p)),val(i) {}"(这是网上下来C++Primer代码)
后者在编译时会出现故障。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询