博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
理解shared_ptr<T> ---2
阅读量:6083 次
发布时间:2019-06-20

本文共 1527 字,大约阅读时间需要 5 分钟。

1、引用计数字段不能放在资源管理类中。我们的解决办法是,把引用计数和资源绑在一起,进行二次封装。但是这样存在一个大问题,不同类型的资源管理类不能兼容。也就是说,shared_ptr<Dog>不能赋值给shared_ptr<Animal>。

2、你可能会想,使用模版成员方法去解决,但是这里有个问题。因为进行了两次封装,u_ptr的类型还是不一样,也不能赋值。你可能会想,我在u_ptr中也建立模版成员方法,这也是错的。思考下,我们要保证,资源管理类指向同一个u_ptr,对u_ptr进行拷贝,那么资源管理类就不是指向同一个u_ptr了,这显然是错的。

3、有没有其它的办法呢?

  问题的关键是,进行了两次封装。不进行两次封装就好了,为了保证资源管理类指向同一个资源,同时指向同一个引用计数值,我可以再建立一个int指针,指向引用计数。

4、示例代码:

1 template 
2 class shared_ptr_2 3 { 4 public: 5 shared_ptr_2(T* ptr):_ptr(ptr),_refCount_ptr(new int(1)) 6 { 7 } 8 9 shared_ptr_2(shared_ptr_2
& rhs)10 {11 _ptr= rhs._ptr;12 _refCount_ptr = rhs._refCount_ptr;13 ++(*_refCount_ptr);14 }15 16 template
17 shared_ptr_2
(shared_ptr_2
& rhs)18 {19 _ptr = rhs._ptr;20 _refCount_ptr = rhs._refCount_ptr;21 ++(*_refCount_ptr);22 }23 24 shared_ptr_2& operator=(shared_ptr_2
& rhs)25 {26 if(this!=&rhs)27 {28 if(--(*_refCount_ptr) ==0)29 {30 delete _ptr;31 delete _refCount_ptr;32 }33 _ptr= rhs._ptr;34 _refCount_ptr = rhs._refCount_ptr;35 ++(*_refCount_ptr);36 }37 return *this;38 }39 40 template
41 shared_ptr_2
& operator=(shared_ptr_2
& rhs)42 {43 ++(*_refCount_ptr);44 if(--(*_refCount_ptr) ==0)45 {46 delete _ptr;47 delete _refCount_ptr;48 }49 _ptr= rhs._ptr;50 _refCount_ptr = rhs._refCount_ptr;51 return *this;52 }53 54 ~shared_ptr_2()55 {56 if(--(*_refCount_ptr) ==0)57 {58 delete _ptr;59 delete _refCount_ptr;60 }61 }62 63 private:64 T* _ptr;65 int* _refCount_ptr;66 67 friend class shared_ptr_2;68 };

 

转载地址:http://qfkwa.baihongyu.com/

你可能感兴趣的文章
astah-professional-7_2_0安装
查看>>
函数是对象-有属性有方法
查看>>
uva 10107 - What is the Median?
查看>>
Linux下基本栈溢出攻击【转】
查看>>
c# 连等算式都在做什么
查看>>
使用c:forEach 控制5个换行
查看>>
java web轻量级开发面试教程摘录,java web面试技巧汇总,如何准备Spring MVC方面的面试...
查看>>
使用ansible工具部署ceph
查看>>
linux系列博文---->深入理解linux启动运行原理(一)
查看>>
Android反编译(一) 之反编译JAVA源码
查看>>
结合当前公司发展情况,技术团队情况,设计一个适合的技术团队绩效考核机制...
查看>>
python-45: opener 的使用
查看>>
cad图纸转换完成的pdf格式模糊应该如何操作?
查看>>
Struts2与Struts1区别
查看>>
网站内容禁止复制解决办法
查看>>
Qt多线程
查看>>
我的友情链接
查看>>
想说一点东西。。。。
查看>>
css知多少(8)——float上篇
查看>>
NLB网路负载均衡管理器详解
查看>>