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

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

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

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

4、示例代码:

 template <typename T>
class shared_ptr_2
{
public:
shared_ptr_2(T* ptr):_ptr(ptr),_refCount_ptr(new int())
{
} shared_ptr_2(shared_ptr_2<T>& rhs)
{
_ptr= rhs._ptr;
_refCount_ptr = rhs._refCount_ptr;
++(*_refCount_ptr);
} template <typename U>
shared_ptr_2<T>(shared_ptr_2<U>& rhs)
{
_ptr = rhs._ptr;
_refCount_ptr = rhs._refCount_ptr;
++(*_refCount_ptr);
} shared_ptr_2& operator=(shared_ptr_2<T>& rhs)
{
if(this!=&rhs)
{
if(--(*_refCount_ptr) ==)
{
delete _ptr;
delete _refCount_ptr;
}
_ptr= rhs._ptr;
_refCount_ptr = rhs._refCount_ptr;
++(*_refCount_ptr);
}
return *this;
} template <typename U>
shared_ptr_2<T>& operator=(shared_ptr_2<U>& rhs)
{
++(*_refCount_ptr);
if(--(*_refCount_ptr) ==)
{
delete _ptr;
delete _refCount_ptr;
}
_ptr= rhs._ptr;
_refCount_ptr = rhs._refCount_ptr;
return *this;
} ~shared_ptr_2()
{
if(--(*_refCount_ptr) ==)
{
delete _ptr;
delete _refCount_ptr;
}
} private:
T* _ptr;
int* _refCount_ptr; friend class shared_ptr_2;
};

理解shared_ptr<T> ---2的更多相关文章

  1. 理解shared_ptr<T>

    1.shared_ptr<T>解决什么问题? auto_ptr有个局限,拥有权转移.这往往不符合我们的需求,有时候我们期望,多个资源管理对象可以共享一个资源,当引用计数为0的时候,执行de ...

  2. 理解 shared_ptr实现copy-on-write(COW)

    看muduo库某个生产者消费者的地方,利用shared_ptr有效减少了锁的范围及无用的拷贝,下面来看一看 // reader 消费者, shared_ptr<map<string,int ...

  3. 如何用enable_shared_from_this 来得到指向自身的shared_ptr 及对enable_shared_from_this 的理解

    在看<Linux多线程服务端编程:使用muduo C++网络库> 的时候,在说到如何防止在将对象的 this 指针作为返回值返回给了调用者时可能会造成的 core dump.需使用 ena ...

  4. ndk学习之c++语言基础复习----C++线程与智能指针

    线程 线程,有时被称为轻量进程,是程序执行的最小单元. C++11线程: 我们知道平常谈C++线程相关的东东基本都是基于之后要学习的posix相关的,其实在C++11有自己新式创建线程的方法,所以先来 ...

  5. C/C++陷阱与套路,当年就是折在这些地儿…

    摘要:本文结合作者的工作经验和学习心得,对C++语言的一些高级特性,做了简单介绍:对一些常见的误解,做了解释澄清:对比较容易犯错的地方,做了归纳总结:希望借此能增进大家对C++语言了解,减少编程出错, ...

  6. C++智能指针的enable_shared_from_this和shared_from_this机制

    前言 之前学习muduo网络库的时候,看到作者陈硕用到了enable_shared_from_this和shared_from_this,一直对此概念是一个模糊的认识,隐约记着这个机制是在计数器智能指 ...

  7. 深入理解智能指针之shared_ptr(一)

    本文基于C++标准库源码分析shared_ptr,旨在搞清楚shared_ptr是什么,线程安全性等,目标能够安全的使用智能指针. (一)shared_ptr是一个类. 首先可以确定的是shared_ ...

  8. 【STL学习】智能指针之shared_ptr

    前面已经学习过auto_ptr,这里补充另外一种智能指针,比auto_ptr要更强力更通用的shared_ptr. shared_ptr 简介及使用选择  几乎所有的程序都需要某种形式的引用计数智能指 ...

  9. Boost源代码学习---shared_ptr.hpp

    最近观看Boost库源代码.Boost功能强大的库,但它的许多源代码,十一细读太费时间,毕竟,还有其他东西要学.所以我决定脱脂感兴趣的章节,他们的设计思路和难以理解的地方记录. shared_ptr是 ...

随机推荐

  1. 函数 buf_block_init

    /********************************************************************//** Initializes a buffer contr ...

  2. 嵌入式linux市场份额

    来自华清远见2014年度的调查统计数据显示,在嵌入式产品研发的软件开发平台的选择上,嵌入式Linux以55%的市场份额遥遥领先于其他嵌入式开发软件发平台,比去年增长了13个百分比,这已经是连续4年比例 ...

  3. CSS sprites 技术

    Css Sprites 技术逐渐流行,各大网站上都可以看到它的身影. 但从本质上,Css Sprites 只是 Css 技术的一个使用小窍门,初学者也能快速上手. Css Sprites 简单解释: ...

  4. ShareSDK 实现新浪微博分享(微信,QQ,新浪微博类似)

    1 . 分享(前提是集成了sdk,配置好了Key),只要实现点击事件,调用shareSina(); ShareSDK.initSDK(this); private void shareSina() { ...

  5. 使用MySQL

    安装MySQL驱动 使用vpn $ pip install mysql-connector-python --allow-external mysql-connector-python import ...

  6. 解决java switch……case不能匹配字符串的问题

    java1.7已经支持了匹配字符串 方案1. enum Animal { dog,cat,bear; public static Animal getAnimal(String animal){ re ...

  7. apache开源项目--ZooKeeper

    ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.名字服务.分布式同步.组服务等.ZooKeeper的目标就是封装好复杂易出错的关键服务 ...

  8. hbase分页查询

    为了广大技术爱好者学习netty,在这里帮新浪微博@nettying宣传下他出版的新书 <netty权威指南>@nettying兄在华为NIO实践多年,这本书是他的技术和经验的一个结晶.N ...

  9. 《深入Java虚拟机学习笔记》- 第4章 网络移动性

    Java虚拟机学习笔记(四)网络移动性

  10. HDU4289 Control 最大流

    经典题,求去掉若干个点,使得两个点不在连通,总价值最少 所以拆点最小割,除了拆点边,流量都为无穷,拆点边是流量为价值 #include <iostream> #include <cs ...