文章目录

  • 1 继承关系类图
  • 2 SharedPointer设计要点
  • 3 代码实现
  • 4 智能指针相关注意点

1 继承关系类图


2 SharedPointer设计要点

SharedPointer肯定是类模板,我们需要通过计数机制(ref)标识堆内存:

  • 堆内存被指向时:ref++;
  • 指针被置空时:ref–;
  • ref==0时:释放堆内存。

计数机制原理剖析:

SharedPointer类的声明:

智能指针的比较 : 由于SharedPointer支持多个对象同时指向一片堆空间;因此,必须支持比较操作!


3 代码实现

SharedPointer.h

#ifndef SHAREDPOINTER_H
#define SHAREDPOINTER_H#include <cstdlib>
#include "Pointer.h"
#include "Exception.h"namespace LemonLib
{template <typename T>
class SharedPointer : public Pointer<T>
{protected:int* m_ref;void assign(const SharedPointer<T>& obj){m_ref = obj.m_ref;this->m_pointer = obj.m_pointer;if (m_ref){(*m_ref)++;}}public:SharedPointer(T* p = NULL) : m_ref(NULL){if (p){m_ref = reinterpret_cast<int*>(malloc(sizeof(int)));if (m_ref){*m_ref = 1;this->m_pointer = p;}else{THROW_EXCEPTION(NoEnoughMemoryException, "No memory to create SharedPointer object...");}}}SharedPointer(const SharedPointer<T>& obj) : Pointer<T>(NULL){assign(obj);}SharedPointer<T>& operator = (const SharedPointer<T>& obj){if (this != &obj){clear();assign(obj);}return *this;}void clear(){T* toDel = this->m_pointer;int* ref = m_ref;this->m_pointer = NULL;m_ref = NULL;if (ref){(*ref)--;if (*ref == 0){free(ref);delete toDel;}}}~SharedPointer(){clear();}
};template <typename T>
bool operator == (const SharedPointer<T>& l, const SharedPointer<T>& r)
{return (l.get() == r.get());    // get函数需要为const函数
}template <typename T>
bool operator != (const SharedPointer<T>& l, const SharedPointer<T>& r)
{return !(l == r);
}}#endif // SHAREDPOINTER_H

main.cpp

#include <iostream>#include "SmartPointer.h"
#include "Exception.h"
#include "Object.h"
#include "List.h"
#include "SeqList.h"
#include "StaticList.h"
#include "DynamicList.h"
#include "Array.h"
#include "StaticArray.h"
#include "DynamicArray.h"
#include "LinkList.h"
#include "StaticLinkList.h"
#include "Pointer.h"
#include "SmartPointer.h"
#include "SharedPointer.h"using namespace std;
using namespace LemonLib;class Test : public Object
{public:int value;Test() : value(66){cout << "Test()" << endl;}~Test(){cout << "~Test()" << endl;}
};int main()
{SharedPointer<Test> sp0 = new Test();SharedPointer<Test> sp1 = sp0;SharedPointer<Test> sp2;sp2 = sp0;sp2->value = 123;cout << sp0->value << endl;cout << sp1->value << endl;cout << sp2->value << endl;sp1.clear();cout << (sp0 == sp1) << endl;const SharedPointer<Test> sp3 = new Test();//sp3->value = 0;//error: assignment of member 'Test::value' in read-only objectreturn 0;
}

4 智能指针相关注意点

指针指针的使用军规:

  • 只用用来指向堆空间中的单个变量(对象);
  • 不同类型的智能指针对象不能混合使用;
  • 不要使用delete释放智能指针指向的堆空间。

SharedPointer智能指针总结:

  • SharedPointer最大程度的模拟了原生指针的行为;
  • 计数机制确保多个智能指针合法的指向同一片堆空间;
  • 智能指针只能用于指向堆空间中的内存;
  • 不同类型的智能指针不要混合使用;
  • 堆对象的生命周期由智能指针进行管理。

SharedPointer相关推荐

  1. DualCircleList

    文章目录 1 Linux内核链表介绍 1.1 移植Linux内核链表 1.1.1 Linux内核链表的位置及依赖 1.1.2 移植时的注意事项 1.2 Linux内核链表剖析 1.2.1 Linux内 ...

  2. DualLinkList

    文章目录 1 单链表的缺陷 2 双向链表的实现 2.1 设计思路 2.2 双向链表的继承层次结构 2.3 DualLinkList的定义 2.4 双向链表的特点 3 代码实现 4 开放性问题 1 单链 ...

  3. CircleList

    文章目录 1 循环链表的实现 1.1 什么是循环链表 1.2 循环链表的逻辑构成 1.3 循环链表的继承层次结构 1.4 循环链表的实现思路 1.5 循环链表的实现要点 2 代码实现 3 循环链表的应 ...

  4. 树——二叉树结点的删除与清除

    1,删除的方式: 1,基于数据元素值的删除: 1,SharedPointer< Tree<T> > remove(const T& value) 1,删除的是那个以结点 ...

  5. qt 如何 指针 自动 释放内存_要是面试官再问你智能指针的问题,就拿这篇文章“盘他”!!!...

    前一段时间,有不少朋友问我关于智能指针的问题,并且反映经常会在面试中被面试官问到,所以今天小豆君就来讲讲我对智能指针的理解,希望能对大家有所帮助 既然讲智能指针,我们就先来看看它为什么会出现. 1 传 ...

  6. 二叉树类图_数据结构(十四)——二叉树

    数据结构(十四)--二叉树 一.二叉树简介 1.二叉树简介 二叉树是由n(n>=0)个结点组成的有序集合,集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树的.互不相交的二叉树组成. ...

  7. 【c++ primer】第五版第十六章习题答案

    练习16.1 给出实例化的定义. 解: 当编译器实例化一个模版时,它使用实际的模版参数代替对应的模版参数来创建出模版的一个新"实例". 练习16.2 编写并测试你自己版本的 com ...

  8. 二叉树结构——BTree、BTreeNode

    目录 二叉树引言 二叉树的性质 二叉树的存储结构设计 二叉树的结点查找操作 二叉树中的插入操作 二叉树中的清除操作 二叉树中的删除操作 二叉树中的属性操作 二叉树中的遍历方式 层次遍历 递归遍历方式 ...

  9. IPC-共享内存 (七猫的藏经阁 )

    一共有三种,常用的是两种:ACE里封装了SRV的和POSIX的,名字叫ACE_Shared_Memory_MM(POSIX)和ACE_Shared_Memory_SV,他们都是从ACE_Shared_ ...

最新文章

  1. 解密淘宝网的开源架构(转)
  2. easymock 图片_easy-mock的使用
  3. 卸载后的mysql和navicat怎么清除干净_清除电脑“牛皮癣 ”,带你回归清爽体验~...
  4. 当我们谈游戏优化时,我们谈些什么
  5. 【ArcGIS风暴】缓冲区分析、叠置分析综合实验案例:购房区域的选择
  6. 根据大小分割大文本_基于深度学习的图像分割在高德地图的实践
  7. arp攻击 python_python之arp攻击
  8. 4.UiCollection API 详细介绍
  9. 【hortonworks/registry】诡异问题之启动了却无法访问
  10. 一加6屏幕测试代码_一加 7的普通版与Pro/参数对比
  11. VTK(五)---内窥镜漫游(基于VMTK血管中心线提取)
  12. STM32CubeMX 安装提示需要java环境(1.8.0_45)
  13. 网站域名服务器 地址查询,查看网站dns域名服务器ip地址查询
  14. Java-----关于IO流的总结
  15. win7无法自动获取dns服务器地址,Windows7系统DNS服务器故障怎么解决?
  16. 作为硅谷大佬,大战周鸿祎是怎样的一种体验?|独家采访
  17. 大炮打蚊子(已AC)
  18. AD19 基础应用技巧(差分线的添加走线与蛇形等长)
  19. 水星无线网dns服务器是什么,水星(mercury)路由器上网方式选哪一个?
  20. pypptee获取城市监测站点历史空气质量数据

热门文章

  1. python制作猜拳游戏代码_python实现猜拳游戏项目
  2. 【控制】多智能体系统总结。4.控制协议。
  3. 通过MATLAB将数据转化为mif文件,供Quartusii软件的ROM核读取调用
  4. 都说AIOps是必然趋势,那实践AIOps之前需要做些什么准备?\n
  5. 深入理解volatile
  6. 慕课网_《RabbitMQ消息中间件极速入门与实战》学习总结
  7. arcgis python 保存当前窗口图形为jpg
  8. 专家:“十三五”中国应建立覆盖城乡的超级WIFI
  9. 推荐!手把手教你使用Git
  10. 转发高人文章:以前写的一些有关代码签名/时间戳数字证书的东东