关闭

实现一个简单的shared_ptr

414人阅读 评论(0) 收藏 举报
分类:
在看《effective C++》第3章时,基本上都是auto_ptr和shared_ptr的原理与应用。
auto_ptr和shared_ptr基本原理都是将构造好(new)的裸资源指针交给对象去打理,当对象释放时自动调用析构函数,在析构函数中delete裸资源指针;从而避免遗忘手动释放指针。
auto_ptr通过拷贝构造或者通过=赋值后,原来的auto_ptr就失效了(裸资源指针赋值为0),裸资源指针的所有权转移到新的auto_ptr对象中去了。
更多关于auto_ptr,参考我之前的总结“C++智能指针auto_ptr”。
在C++11中,auto_ptr已经被unique_ptr取代,关于unique_ptr,参考下“unique_ptr使用简介”。
shared_ptr通过引用计数(reference-counting smart pointer,RCSP),可以让多个智能指针对象同时拥有裸资源指针,只有在最后一个shared_ptr对象释放时,才会delete裸资源指针。

我在下面的代码中实现了一个简单的shared_ptr,后续看到模板部分再来补充吧。

#include<iostream>  
#include<cassert>
using namespace std;  
   
template <class T>  
class shared_ptr  
{  
private:  
    T *_ptr;  
    int *pCount;  //计数指针;
    //int pCount; //如果用对象,每次初始化之后都是新的值;如果用static,则不同的智能指针会拥有相同的count。

public:  
    shared_ptr(T *p) : _ptr(p), pCount(new int(1))  //构造函数  
    {  
    }
    shared_ptr(shared_ptr& another)
    {
      _ptr = another._ptr;
	   
      pCount = another.pCount;  //浅拷贝,所有对象指向公有的 *pCount
      ++(*pCount);
    }
    T& operator *()        //重载*操作符  
    {  
        return *_ptr;  
    }  
    T* operator ->()       //重载->操作符  
    {  
        return _ptr;  
    }
    int getCount()  //获取引用计数
    {
        return *pCount;
    }	
    ~shared_ptr()  //析构函数  
    {   
       (*pCount)--;
       if(0 == *pCount)
       {
           delete _ptr;
           delete pCount;
       }        		
    }  
};  
  
class Test
{
public:
  Test()
  {
    cout<<"constructor of Test()"<<endl;
  }
  ~Test()
  {
    cout<<"de-constructor of Test()"<<endl;
  }
  void helloTest()
  {
    cout<<"helloTest()"<<endl;  
  }
  int v;
};  

//入参和出参,分别会调用SmartPointer的拷贝构造函数和析构函数
//引用计数pCount也会分别+1和-1.  
void testSmartPointer(shared_ptr<Test> sp) 
{
   cout<<sp.getCount()<<endl;
}  
  
int main(void)  
{  
    //构造一次,拷贝三次
    Test *p = new Test;
    shared_ptr<Test> s_p(p);
    //shared_ptr<Test> s_p1(p);    //错误,p会被多析构一次
    shared_ptr<Test> s_p2(s_p);
    shared_ptr<Test> s_p3(s_p2);
    shared_ptr<Test> s_p4(s_p3);
    s_p->helloTest();
    (*s_p4).helloTest();
	
    testSmartPointer(s_p4);
		
    s_p->v = 10;
    assert(s_p4->v == 10);

    cout<<s_p4.getCount()<<endl;	
    assert(s_p.getCount() == s_p4.getCount());	
    return 0;  
}  


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

理解 boost::shared_ptr 中的引用计数是如何工作的

引用计数原理 指向相同资源的所有 shared_ptr 共享“引用计数管理区域”,并采用原子操作保证该区域中的引用计数值被互斥地访问。“引用计数管理区域”是指通过 new 创建的 sp_counte...
  • wohenfanjian
  • wohenfanjian
  • 2016-07-13 17:12
  • 1570

(推荐)智能指针boost::weak_ptr 详解

【1】boost::weak_ptr简介 boost::weak_ptr属于boost库,定义在namespace boost中,包含头文件 #include便可以使用。 【2】boost::we...
  • acs713
  • acs713
  • 2014-06-07 09:53
  • 6809

shared_ptr基于引用计数智能指针实现

智能指针是什么 简单来说,智能指针是一个类,它对普通指针进行封装,使智能指针类对象具有普通指针类型一样的操作。具体而言,复制对象时,副本和原对象都指向同一存储区域,如果通过一个副本改变其所指的值...
  • NicolasYan
  • NicolasYan
  • 2016-01-26 16:09
  • 2325

实现一个简单的 shared_ptr

智能指针的简单实现
  • u013701824
  • u013701824
  • 2017-05-27 11:27
  • 106

C++简单版shared_ptr智能指针的实现

sp_counted_base.h#pragma once class sp_counted_base//管理对象引用计数 { public: sp_counted_base() :count...
  • liuhuiyan_2014
  • liuhuiyan_2014
  • 2015-06-21 21:25
  • 721

shared_ptr 的简单实现

如果对shared_ptr是什么不是很清楚,可以百度或是参考C++primer等参考书。 文章只是对其进行了一个简单实现,来模拟shared_ptr的功能。
  • wanghuayang_1021
  • wanghuayang_1021
  • 2016-08-12 15:40
  • 141

智能指针shared_ptr 的简单实现

#include using namespace std; class U_Ptr { friend class HasPtr; int *ip; size_t use; U_Ptr(int ...
  • leichaowen
  • leichaowen
  • 2016-06-09 13:25
  • 377

用shared_ptr实现多线程对全局变量的读写,copy-on-write技术

  • 2013-08-06 19:55
  • 67KB
  • 下载

使用 shared_ptr 的一個問題代碼

代碼如下: #include #include #include class A { public: void Add(); void Delete(); ~A(); private: st...
  • CaspianSea
  • CaspianSea
  • 2015-09-24 07:43
  • 1008

Boost库简单运用——shared_ptr

Boost库简单运用——shared_ptr概述​ 在C++项目中,内存管理的问题一直是个大问题,也是个很常见的问题。项目交由经验不足的程序员来编写维护,常出现内存泄漏、访问非法内存之类的问题,资...
  • oYinGui1
  • oYinGui1
  • 2017-03-01 20:02
  • 201
    个人资料
    • 访问:136417次
    • 积分:3063
    • 等级:
    • 排名:第13146名
    • 原创:173篇
    • 转载:1篇
    • 译文:1篇
    • 评论:28条
    博客专栏
    最新评论