zoukankan      html  css  js  c++  java
  • C/C++知识要点5——智能指针原理及自己定义实现

    智能指针概述:

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

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


  • 相关阅读:
    Android开发中完全退出程序的三种方法
    android绑定sqlite数据库与程序一起发布
    Android数据存储方式:SharePreference、SQLite、ContentProvider有什么不同?
    [Android]发布Sqlite数据库
    Android编程获取手机型号,本机电话号码,sdk版本及firmware版本号(即系统版本号)
    解决Android的ListView控件滚动时背景变黑
    android 获取当前程序路径
    免费的Android UI库及组件推荐
    Android界面特殊全汇总
    Android显示GIF动画 GifView
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7073748.html
Copyright © 2011-2022 走看看