标准库shared_ptr智能指针的实现

目前测试功能正常。若有不完善的地方在改进吧。时候不早了睡觉去,哎,翘课会被抓,不冒险了。晚安全世界O(∩_∩)O

  1 /*************************************************************************
  2 *my shared_ptr:  share_ptr
  3 *author:ERIC
  4 *blog:http://www.ilovecpp.com
  5 *time:2015-5-28 01:36:43
  6 *************************************************************************/
  7
  8 template <typename T> class share_ptr {
  9 private:
 10     T* __ptr;
 11     int* __pcounts;
 12 public:
 13     share_ptr(T* p= NULL);
 14     share_ptr(const share_ptr<T>& src);
 15     share_ptr& operator=(share_ptr<T>& src);
 16     ~share_ptr();
 17     operator bool() const;//支持if(p)形式
 18     T* operator-> () const;
 19     T& operator*() const;
 20     T* get() const;
 21     int use_counts() const;//返回引用计数
 22     bool unique() const;//当前智能指针是否唯一
 23     void swap(share_ptr& rhs);//交换,成员函数
 24     template <typename Type>//友元函数,交换两个智能指针
 25     friend void swap(share_ptr<Type>& lhs,share_ptr<Type>& rhs);
 26 };
 27
 28 template<typename T>
 29 share_ptr<T>::share_ptr(T* p)
 30     :__ptr(p),__pcounts(new int(0))
 31 {
 32     if(__ptr)
 33         *__pcounts = 1;
 34 }
 35
 36 template<typename T>
 37 share_ptr<T>::~share_ptr()
 38 {
 39     --*__pcounts;
 40     if(*__pcounts == 0)
 41     {//空智能指针这里delete  __ptr也安全,delete NULL;
 42         delete __pcounts;
 43         delete __ptr;
 44     }
 45 }
 46
 47 /*__ptr(new T(src)) 很重要 ,如果直接__ptr(new T)
 48 *会由于T类没有默认构造函数而出错
 49 *测试的时候才发现这个问题的
 50 */
 51 template<typename T>
 52 share_ptr<T>::share_ptr (const share_ptr<T>& src)
 53     :__pcounts(new int),__ptr(new T(src))
 54 {
 55     ++*src.__pcounts;
 56     __ptr = src.__ptr;
 57     __pcounts = src.__pcounts;
 58 }
 59
 60 template <typename T>
 61 share_ptr<T>& share_ptr<T>::operator= (share_ptr<T>& src)
 62 {
 63     --*__pcounts;
 64     //如果是空智能指针的话 __pcounts == -1,那块内存也得释放
 65     if(*__pcounts == 0 || *__pcounts == -1)
 66         delete __pcounts;
 67     ++*src.__pcounts;
 68     __ptr = src.__ptr;
 69     __pcounts = src.__pcounts;
 70     return *this;
 71 }
 72
 73 //支持if(p)这样的操作
 74 template<typename T>
 75 share_ptr<T>::operator bool() const
 76 {
 77     return __ptr;
 78 }
 79
 80 template<typename T>
 81 T* share_ptr<T>::operator->() const
 82 {
 83     return __ptr;
 84 }
 85
 86 template<typename T>
 87 T& share_ptr<T>::operator*() const
 88 {
 89     return *__ptr;
 90 }
 91
 92
 93 template<typename T>
 94 T* share_ptr<T>::get() const
 95 {
 96     return __ptr;
 97 }
 98
 99 template<typename T>
100 int share_ptr<T>::use_counts() const
101 {
102     return *__pcounts;
103 }
104
105 template<typename T>
106 bool share_ptr<T>::unique() const
107 {
108     if(*__pcounts == 1)
109         return true;
110     else
111         return false;
112 }
113
114 template<typename T>
115 void share_ptr<T>::swap(share_ptr<T>& rhs)
116 {
117     T* tmpPtr = rhs.__ptr;
118     rhs.__ptr = __ptr;
119     __ptr = tmpPtr;
120     int* tmpPcounts = rhs.__pcounts;
121     rhs.__pcounts = __pcounts;
122     __pcounts = tmpPcounts;
123 }
124
125 template<typename T>
126 void swap(share_ptr<T>& lhs,share_ptr<T>& rhs)
127 {
128     T* tmpPtr = rhs.__ptr;
129     rhs.__ptr = lhs.__ptr;
130     lhs.__ptr = tmpPtr;
131     int* tmpPcounts = rhs.__pcounts;
132     rhs.__pcounts = lhs.__pcounts;
133     lhs.__pcounts = tmpPcounts;
134 }
135
136 //c++11 make_shared<T>(args)
137 template<typename T>
138 share_ptr<T> make_share(T args)
139 {
140     return new T(args);
141 }
时间: 2025-01-04 07:28:03

标准库shared_ptr智能指针的实现的相关文章

Boost库中的智能指针 shared_ptr智能指针

shared_ptr智能指针的意思即:boost::shared_ptr是可以智能的管理动态分配的内存资源,几个智能指针可以同时共享一个动态分配的内存的所有权. 下面我们通过一个例子来学习一下它的用法: 注 :使用shared_ptr智能指针,要加入#include <boost/shared_ptr.hpp>头文件 class example { public: ~example() { std::cout <<"It's over\n"; } void do

auto_ptr,shared_ptr 智能指针的使用

Q: 那个auto_ptr是什么东东啊?为什么没有auto_array?A: 哦,auto_ptr是一个很简单的资源封装类,是在<memory>头文件中定义的.它使用“资源分配即初始化”技术来保证资源在发生异常时也能被安全释放(“exception safety”).一个auto_ptr封装了一个指针,也可以被当作指针来使用.当其生命周期到了尽头,auto_ptr会自动释放指针.例如: #include<memory> using namespace std;  struct X

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

多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为了省时间一般都是任由这个内存泄漏发生. 当然也可以经过复杂的设计,由一个监控线程来统一删除, 但这样会增加代码量和复杂度.这下好了,shared_ptr 可以方便的解决问题,因为它是引用计数和线程安全的. shared_ptr不用手动去释放资源,它会智能地在合适的时候去自动释放. 我们来测试看看效果

C++11 shared_ptr(智能指针)

在确保new动态分配的内存空间在使用结束之后,释放是一件麻烦事.C++11模板库的头文件中定义的智能指针,即shared_ptr模板,就是用来解决这个问题的. 它是将new运算符返回的指针p交给一个shared_ptr对象"托管",就不用担心要在哪里写delete p语句 ---实际根本不需要编写这条语句,托管p的shared_ptr对象在消亡时会自动执行delete p,而且,该shared_ptr对象能像指针p一样使用,即假设托管p的shared_ptr的shared_ptr对象叫

shared_ptr智能指针

来自博客:https://www.cnblogs.com/lzpong/p/6188034.html 多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为了省时间一般都是任由这个内存泄漏发生. 当然也可以经过复杂的设计,由一个监控线程来统一删除, 但这样会增加代码量和复杂度.这下好了,shared_ptr 可以方便的解决问题,因为它是引用计数和线程安

现代C++学习笔记之一入门篇:智能指针(C++ 11)

原始指针:通过new建立的*指针 智能指针:通过智能指针关键字(unique_ptr, shared_ptr ,weak_ptr)建立的指针 在现代 C++ 编程中,标准库包含智能指针,该指针用于确保程序不存在内存和资源泄漏且是异常安全的. 在现代 C++ 中,原始指针仅用于范围有限的小代码块.循环或者性能至关重要且不会混淆所有权的 Helper 函数中. 1 void UseRawPointer() 2 { 3 // Using a raw pointer -- not recommended

C++技术问题总结-第9篇 智能指针

智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,能够在适当的时间自动删除指向的对象外,能够确保正确的销毁动态分配的对象. 标准库的智能指针为auto_ptr.boost库的智能指针族在功能上做了扩展. 1.auto_ptr auto_ptr注意事项如下. ①auto_ptr不能共享所有权. ②auto_ptr不能指向数组. ③auto_ptr不能作为容器成员. ④不能通过赋值操纵来初始化auto_ptr. 2.boost_ptr boost库对智能指针族做了扩展,使用

c/c++ vector,map,set,智能指针,综合运用的小例子

标准库,智能指针,综合运用的小例子 功能说明:查询单词在文件中出现的次数,如果在同一行出现多次,只算一次. 比如查询单词:你好 输出的结果: 你好 出现了:2次 (行号 2)xxxxxxx 你好 (行号 3)bbb ccc 你好 xxxxx 注意点:代码的46行,必须使用引用. //非常重要,必须用引用,要不然就会拷贝一个新的set给lines,不是map里的set auto &lines = wm[word];//lines是shared_ptr 代码: #include <iostrea

详解Boost库智能指针(shared_ptr &amp;&amp; scoped_ptr &amp;&amp; weak_ptr )

我们先来解释一下什么叫智能指针? 智能指针是利用RAII(在对象的构造函数中执行资源的获取(指针的初始化),在析构函数中释放(delete 指针):这种技法把它称之为RAII(Resource Acquisition Is Initialization:资源获取即初始化))来管理资源. 其本质思想是:将堆对象的生存期用栈对象(智能指针)来管理.也就是当new一个堆对象的时候,立刻用智能指针来接管,具体做法是在构造函数中进行初始化(用一个指针指向堆对象),在析构函数调用delete来释放堆对象.由