智能指针概述:

智能指针用来管理动态对象。其行为类似于常规指针,重要的差别是:它负责自己主动释放所指向的对象。
C++ 11标准库提供两种智能指针:shared_ptr、unique_ptr
差别是:shared_ptr同意多个指针指向同一个对象;unique_ptr则独占所指向的对象。

另外。另一种weak_ptr的伴随类,它是一种弱引用。指向shared_ptr所管理的对象。

自己定义智能指针实现方法:

实现方法使用引用计数方法。


智能指针将一个计数器与类指向的对象相关联,引用计数跟踪一共同拥有多少个类对象共享同一指针。

实现要点:
  1. 每次创建类的新对象的时候,初始化指针并将引用计数置为1。
  2. 当对象作为还有一对象的副本而创建的时候,也就是拷贝构造时候,拷贝构造函数拷贝指针并添加与之相应的引用计数;
  3. 当对一个对象进行赋值操作的时候,赋值操作符 降低左操作数所指对象的引用计数(若引用计数减为0,则删除该对象),并添加右操作数指向对象的引用计数(由于左側指针指向了右側指针指向的对象,所以右側指针指向的对象的引用计数添加1);
  4. 调用析构函数时候,降低引用计数(若减为0。则删除基础对象);

实现智能指针有两种经典策略:一是引入辅助类,二是使用句柄类。

以下样例使用辅助类来实现:

#include"iostream"
using namespace std;
//定义一个普通类
class bookClass{
private:
string name;
int price;
public:
int getPrice(){ return price; }
};
//辅助类
class Counter
{
private:
friend class smartPoint;
Counter(bookClass *book) :bk(book), count(1){};
~Counter(){ delete bk; };
int count;
bookClass* bk;
};
//智能指针类
class smartPoint
{
public:
smartPoint(bookClass *bkC) :RpCnt(new Counter(bkC)){}
smartPoint(const smartPoint &sp) :RpCnt(sp.RpCnt){ ++RpCnt->count; }
smartPoint& operator= (const smartPoint& rhs)
{
++rhs.RpCnt->count;
if (--RpCnt->count == 0)
delete RpCnt;
RpCnt = rhs.RpCnt;
return *this;
} ~smartPoint(){
if (--RpCnt->count == 0)
delete RpCnt;
}
private:
Counter *RpCnt;
};

上述代码,实现了一个简单的智能指针类。可编译执行,逐条对照实现要点中的要求。



C/C++知识要点5——智能指针原理及自己定义实现的更多相关文章

  1. C++智能指针 原理、使用与实现

    目录 理解智能指针的原理 智能指针的使用 智能指针的设计和实现 1.智能指针的作用 C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理.程序员自己管理堆内存可以提高了程序 ...

  2. 智能指针原理及实现(2)unique_ptr

    只允许基础指针的一个所有者. 可以移到新所有者(具有移动语义),但不会复制或共享(即我们无法得到指向同一个对象的两个unique_ptr). 替换已弃用的 auto_ptr. 相较于 boost::s ...

  3. 智能指针原理及实现(1)shared_ptr

    0.异常安全 C++没有内存回收机制,每次程序员new出来的对象需要手动delete,流程复杂时可能会漏掉delete,导致内存泄漏.于是C++引入智能指针,可用于动态资源管理,资源即对象的管理策略. ...

  4. C++11智能指针原理和实现

    一.智能指针起因 在C++中,动态内存的管理是由程序员自己申请和释放的,用一对运算符完成:new和delete. new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针: delete:指向 ...

  5. 【UE4 C++ 基础知识】<15> 智能指针 TSharedPtr、UniquePtr、TWeakPtr、TSharedRef

    基本概念 UE4 对 UObject 对象提供垃圾回收 UE4 对原生对象不提供垃圾回收,需要手动进行清理 方式 malloc / free new / delete new与malloc的区别在于, ...

  6. 基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

  7. [C++]智能指针的实现与使用

    智能指针 智能指针是当我们在使用对象时,有时会把对象的内存分配在堆上忘记释放,导致内存泄露,并且当多个指针共享同一个对象的内存时,容易出现重复释放内存,导致错误. 我们针对所需要共享的对象,手动完成一 ...

  8. c++学习笔记—动态内存与智能指针浅析

    我们的程序使用内存包含以下几种: 静态内存用来保存局部static对象.类static数据成员以及定义在任何函数之外的变量,在使用之前分配,在程序结束时销毁. 栈内存用来保存定义在函数内部的非stat ...

  9. C++新特性---智能指针

    智能指针:     为什么需要智能指针?         1. malloc出来的空间,没有进行释放,存在内存泄漏的问题.          2. 异常安全问题.如果在malloc和free之间如果存 ...

随机推荐

  1. 基于aspectj的aop的操作

    1.引入相关的jar包 2.建两个类 public class Book { public void add(){ System.out.println("add-----------&qu ...

  2. rk3288的pcba模块编译调试笔记【学习笔记】

    平台信息:内核:linux3.0.68 系统:android/android6.0平台:rk3288 作者:庄泽彬(欢迎转载,请注明作者) 邮箱:2760715357@qq.com 摘要:最近在负责r ...

  3. bzoj3673: 可持久化并查集 by zky&&3674: 可持久化并查集加强版

    主席树可持久化数组,还挺好YY的 然而加强版要路径压缩.. 发现压了都RE 结果看了看数据,默默的把让fx的父亲变成fy反过来让fy的父亲变成fx 搞笑啊 #include<cstdio> ...

  4. 找新朋友(hdoj--1286--欧拉函数)

    欢迎参加--每周六晚的BestCoder(有米!) 找新朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  5. [HTML] 如何使用robots.txt防止搜索引擎抓取页面

    Robots.txt 文件对抓取网络的搜索引擎漫游器(称为漫游器)进行限制.这些漫游器是自动的,在它们访问网页前会查看是否存在限制其访问特定网页的 robots.txt 文件.如果你想保护网站上的某些 ...

  6. BZOJ 4403 2982 Lucas定理模板

    思路: Lucas定理的模板题.. 4403 //By SiriusRen #include <cstdio> using namespace std; ; #define int lon ...

  7. NOIP2013 D1T3 货车运输 倍增LCA OR 并查集按秩合并

    思路: Kruskal求最大生成树+倍增LCA // by SiriusRen #include <cstdio> #include <cstring> #include &l ...

  8. weborm aspx开发基础

    ASP.NET - .net开发网站应用程序的技术总称,来源于 ASP 两种方法技术—WebForm: MVC:java用 十二个表单元素: 文本框<input type="text& ...

  9. 应用MVP模式对遗留代码进行重构

    AV(Autonomous View)自治视图 在面向终端用户的应用中,都需要一个可视化的UI来与用户交互.这个UI称为View视图. 在早期,我们习惯将所有前台的逻辑,与视图揉在一起,称为AV自治视 ...

  10. 09.javaweb简单标签编程

    一.简单标签 1,  简介:由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单.便于编写和调用 ...