《Effective C++》在资源管理一节提到了智能指针,智能指针中最著名的当属auto_ptr和shared_ptr。本文主要研究两者的实现。

auto_ptr的实现:

template <class T>
class auto_ptr
{
private:
T *ptr;
public:
explicit auto_ptr(T *p = ) : ptr(p){}
~auto_ptr(){delete ptr;}
auto_ptr(auto_ptr &rhs) : ptr(rhs.release()){}
auto_ptr& operator=(auto_ptr &rhs)
{
reset(rhs.release());
return *this;
}
T& operator*() const {return *ptr;}
T* operator->() const {return ptr;}
T* get() const {return ptr;}
T* release()
{
T *tmp = ptr;
ptr = ;
return tmp;
}
void reset(T *p = )
{
if (p != ptr)
{
delete ptr;
ptr = p;
}
}
};

参考资料:https://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/a00761_source.html

auto_ptr的缺点:

  1. 复制或赋值行为不正常,因此不能置于容器中。

  2. 不能用于管理动态分配的数组。

shared_ptr通过reference counting实现,这里有个简易版本。

template <class T>
class countedPtr {
private:
T *ptr;
int *count;
public:
explicit countedPtr(T *p = ) : ptr(p), count(new int()) {}
countedPtr(const countedPtr &rhs) : ptr(rhs.ptr), count(rhs.count)
{
++*count;
}
~countedPtr()
{
dispose();
}
countedPtr& operator=(const countedPtr &rhs)
{
if (this != &rhs)
{
dispose();
ptr = rhs.ptr;
count = rhs.count;
++*count;
}
return *this;
}
T& operator*() { return *ptr; }
T* operator->() { return ptr; }
private:
void dispose()
{
if (--*count == )
{
delete ptr;
delete count;
}
}
};

参考资料:

引用计数智能指针的简单实现

shared_ptr缺点:

存在环状引用问题。

最新文章

  1. Javascript 中 with 的替代方案和String 中的正则方法
  2. spring项目部署到resin4中的无法注入问题
  3. LabVIEW类方法浏览器-Class Method Browser
  4. bootstrap源码分析之form、navbar
  5. PHP fwrite() 函数与 file_put_contents() 函数的比较
  6. oracle之to_char,to_date用法
  7. Hibernate 以流的方式获取数据
  8. Python3.2官方文件翻译-工具列表和十进制浮点计算
  9. node.js异步控制流程 回调,事件,promise和async/await
  10. 个人作业2:APP案例分析
  11. [HNOI2008]水平可见直线
  12. yum [Errno 256] No more mirrors to try 解决方法
  13. 2018-2019-1 20189201 《LInux内核原理与分析》第七周作业
  14. VBoxManage安装
  15. 团队项目 NABCD分析java音乐播放器
  16. poj-2142-exgcd/解的和最小
  17. 无法连接到localhost。其他信息:用户“sa”登录失败。原因:该用户被禁用。(Microsoft Sql Server,错误:18470).
  18. HDU 6181 第k短路
  19. 5 个关键点!优化你的 UI 原型设计
  20. win10 Docker Toolbox 默认路径不能写问题

热门文章

  1. 武汉加油!(Python版)
  2. 小程序以及H5页面上IphoneX底部安全区域小黑条适配问题
  3. 005-循环结构(上)-C语言笔记
  4. AJ学IOS(55)多线程网络之图片下载框架之SDWebImage
  5. 提高万恶的KPI,切忌要避开这六个低效的编程习惯
  6. sws_接口自动化_demo
  7. php7.2.1+redis3.2.1 安装redis扩展(windows系统)
  8. vue2.x学习笔记(十)
  9. 女屌丝前端逆袭记(一)之浅谈float
  10. Python 实用冷门知识整理