实现一个简单的shared_ptr

原创 2016年05月30日 14:22:59
在看《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;  
}  


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

实现一个简单的 shared_ptr

智能指针的简单实现

shared_ptr 的简单实现

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

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

sp_counted_base.h#pragma once class sp_counted_base//管理对象引用计数 { public: sp_counted_base() :count...

智能指针shared_ptr 的简单实现

#include using namespace std; class U_Ptr { friend class HasPtr; int *ip; size_t use; U_Ptr(int ...

Boost库简单运用——shared_ptr

Boost库简单运用——shared_ptr概述​ 在C++项目中,内存管理的问题一直是个大问题,也是个很常见的问题。项目交由经验不足的程序员来编写维护,常出现内存泄漏、访问非法内存之类的问题,资...

理解 shared_ptr实现copy-on-write(COW)

shared_ptr实现COW(Copy-On-Write)

boost shared_ptr实现浅析

版本boost 1.43.0 头文件 shared_ptr是boost中最强大的智能指针,基于C++非常精巧的实现了“引用计数”的功能 shared_ptr只有两个类成员变量 T ...
  • vinowan
  • vinowan
  • 2011年11月06日 20:06
  • 1547

boost::shared_ptr 分析与实现

引用地址:http://www.cnblogs.com/gadfly/archive/2010/09/27/1836992.html     http://blog.chinaunix.net/...

boost::shared_ptr 分析与实现

http://blog.chinaunix.net/u/14337/showart_299314.html /*****************************************...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实现一个简单的shared_ptr
举报原因:
原因补充:

(最多只允许输入30个字)