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

基础对象类

class Point

{

public:

    Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { }

    int getX() const
{
return x;
} int getY() const
{
return y;
} void setX(int xVal)
{
x = xVal;
} void setY(int yVal)
{
y = yVal;
} private: int x, y; };

辅助类

//模板类作为友元时要先有声明

template <typename T>

class SmartPtr;

template <typename T>

class U_Ptr     //辅助类

{

private:

    //该类成员访问权限全部为private,因为不想让用户直接使用该类

    friend class SmartPtr<T>;      //定义智能指针类为友元,因为智能指针类需要直接操纵辅助类

    //构造函数的参数为基础对象的指针

    U_Ptr(T *ptr) : p(ptr), count(1) { }

    //析构函数

    ~U_Ptr()
{
delete p;
} //引用计数 int count; //基础对象指针 T *p; };

智能指针类

template <typename T>

class SmartPtr   //智能指针类

{

public:

    SmartPtr(T *ptr) : rp(new U_Ptr<T>(ptr)) { }     //构造函数

    SmartPtr(const SmartPtr<T> &sp) : rp(sp.rp)
{
++rp->count; //复制构造函数
} SmartPtr &operator=(const SmartPtr<T> &rhs) //重载赋值操作符
{ ++rhs.rp->count; //首先将右操作数引用计数加1, if (--rp->count == 0) //然后将引用计数减1,可以应对自赋值 delete rp; rp = rhs.rp; return *this; } T &operator *() //重载*操作符 { return *(rp->p); } T *operator ->() //重载->操作符 { return rp->p; } ~SmartPtr() //析构函数
{ if (--rp->count == 0) //当引用计数减为0时,删除辅助类对象指针,从而删除基础对象 delete rp; else cout << "还有" << rp->count << "个指针指向基础对象" << endl; } private: U_Ptr<T> *rp; //辅助类对象指针 };

使用测试

int main()

{

    int *i = new int(2);

    {

        SmartPtr<int> ptr1(i);

        {

            SmartPtr<int> ptr2(ptr1);

            {

                SmartPtr<int> ptr3 = ptr2;

                cout << *ptr1 << endl;

                *ptr1 = 20;

                cout << *ptr2 << endl;

            }

        }

    }

    system("pause");

    return 0;

}

参考:

C++智能指针的更多相关文章

  1. enote笔记法使用范例(2)——指针(1)智能指针

    要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...

  2. C++11 shared_ptr 智能指针 的使用,避免内存泄露

    多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...

  3. EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针

    一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...

  4. 智能指针shared_ptr的用法

    为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈 ...

  5. 智能指针unique_ptr的用法

    unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...

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

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

  7. C++ 引用计数技术及智能指针的简单实现

    一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧).最近花了点时间认真看了智能指针,特地来写这篇文章. 1.智能指针是什么 简单来说,智能指针是一个类,它对普 ...

  8. C++11智能指针读书笔记;

    智能指针是一个类对象,而非一个指针对象. 原始指针:通过new建立的*指针 智能指针:通过智能指针关键字(unique_ptr, shared_ptr ,weak_ptr)建立的指针 它的一种通用实现 ...

  9. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

随机推荐

  1. RSA非对称加密,使用OpenSSL生成证书,iOS加密,java解密

    最近换了一份工作,工作了大概一个多月了吧.差不多得有两个月没有更新博客了吧.在新公司自己写了一个iOS的比较通用的可以架构一个中型应用的不算是框架的一个结构,并已经投入使用.哈哈 说说文章标题的相关的 ...

  2. C++常见笔试面试要点以及常见问题

    1. C++常见笔试面试要点: C++语言相关: (1) 虚函数(多态)的内部实现 (2) 智能指针用过哪些?shared_ptr和unique_ptr用的时候需要注意什么?shared_ptr的实现 ...

  3. ESLint的使用笔记

    原文地址:https://csspod.com/getting-started-with-eslint/?utm_source=tuicool&utm_medium=referral 在团队协 ...

  4. 基于开源项目SharpMap的热力图(HeatLayer)实现。

    当前公司需要一个用时较少的热力图呈现方案,在避免较底层的GDI开发和比较了多家GIS产品的实际效果之后,团队决定用sharpMap的API来实现,由于之前框架采用的是另外一个开源项目GMap.net, ...

  5. android SystemServer.java启动的服务。

    EntropyService:熵(shang)服务,用于产生随机数PowerManagerService:电源管理服务ActivityManagerService:最核心服务之一,Activity管理 ...

  6. Kotlin的android扩展:对findViewById说再见(KAD 04)

    作者:Antonio Leiva 时间:Dec 12, 2016 原文链接:http://antonioleiva.com/kotlin-android-extensions/ 你也许已厌倦日复一日使 ...

  7. JavaScript知识结构图

    画的一个知识结构图,方便理解.

  8. 避免调试代码导致IE出错

    记录一下 if(!window.console){ var names = ["log", "debug", "info", "w ...

  9. ABP源码分析三十四:ABP.Web.Mvc

    ABP.Web.Mvc模块主要完成两个任务: 第一,通过自定义的AbpController抽象基类封装ABP核心模块中的功能,以便利的方式提供给我们创建controller使用. 第二,一些常见的基础 ...

  10. Javascript之变量作用域

    分析: 无论是强类型语言c#.c++.java等语言,还是弱类型语言如Javascript,所有变量可以抽象为两种类型,即局部变量和全局变量. 全局变量:整个作用域可见. 局部变量:局部可见,退出作用 ...