c++primer里有关智能指针的一个疑问。
答案:2 悬赏:30 手机版
解决时间 2021-02-04 18:20
- 提问者网友:欺烟
- 2021-02-04 08:06
c++primer里有关智能指针的一个疑问。
最佳答案
- 五星知识达人网友:白昼之月
- 2021-02-04 08:41
这书我看过了 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还是指向原来的地方啊…追问能不能说清楚点,我理解力差 呵呵追答噢 正好我的书柜有这书,是这样的,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对象还能访问到p指针所指向的那块内存吗?要不Q聊吧追答不能访问到那块内存 既然释放了 就没有内容了 只是P指向的地址存在 如果这样:P=NULL 那么地址就没有 如果没有那句话 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对象还能访问到p指针所指向的那块内存吗?要不Q聊吧追答不能访问到那块内存 既然释放了 就没有内容了 只是P指向的地址存在 如果这样:P=NULL 那么地址就没有 如果没有那句话 P是野指针 你的扣扣多少
全部回答
- 1楼网友:逃夭
- 2021-02-04 08:46
"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代码)
后者在编译时会出现故障。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯