智能指针概述:

智能指针用来管理动态对象。其行为类似于常规指针,重要的差别是:它负责自己主动释放所指向的对象。
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. oc3--类方法1

    // // main.m // 第一个OC类-方法 #import <Foundation/Foundation.h> /* C语言中函数分为声明和实现,OC中定义类, 就是在写类的声明和 ...

  2. c14---排序,查找

    // // main.c // 冒泡排序 // // Created by xiaomage on 15/6/10. // Copyright (c) 2015年 xiaomage. All righ ...

  3. 国外物联网平台初探(六) ——Electric Imp

    公司背景 Electric Imp成立于2011年,公司设立在美国加利福尼亚州洛斯阿尔托斯和英国剑桥 公司投资者包括:富士康技术集团.PTI创投.Rampart资本.Redpoint创投 定位 Ele ...

  4. Codeforces Round #512 (Div. 2) D.Vasya and Triangle 数学

    题面 题意:给你n,m,k,在你在(0,0)到(n,m)的矩形内,选3个格点(x,y都是整数),使得三角形面积为n*m/k,不能找到则输出-1 题解:由毕克定理知道,格点多边形的面积必为1/2的整数倍 ...

  5. DDL:对表___table___的相关操作

    1) 增加列 语法: alter table 表名 add 列名 类型(长度) 约束; 2) 修改现有列类型.长度和约束 语法:alter table 表名 modify 列名 类型(长度) 约束; ...

  6. [Offer收割]编程练习赛32

    气泡图 两两判断关系,dfs. #include<stdio.h> #include<string.h> #include<stdlib.h> #include&l ...

  7. 企业级时间轴插件Vue-timelinepick

    简介 时间范围选择插件 取当前时间之前一段时间范围 按刻,小时,天分类 在线演示及下载 在线演示:https://yelingfeng.github.io/vue-timelinepick/ 本地下载 ...

  8. Java基础3一基础语句

    1.条件语句:所谓的条件语句就是指有选择的去执行部分代码. 包括:if条件语句和switch条件语句 if条件语句: 语法: (1)if(条件语句){ //条件成立时需要执行的代码   } (2)if ...

  9. 自定义安装MS Office Project2007会出错

    作者:朱金灿 来源:http://blog.csdn.net/clever101 今天使用虚拟光驱文件自定义安装MSOffice Project2007,如下图: 然后总是出现一个错误: 从网上找来一 ...

  10. Python 实现简单图片验证码登录

    朋友说公司要在测试环境做接口测试,登录时需要传入正确的图片的验证码,本着懒省事的原则,推荐他把测试环境的图片验证码写死,我们公司也是这么做的^_^.劝说无果/(ㄒoㄒ)/~~,只能通过 OCR 技术来 ...