zoukankan      html  css  js  c++  java
  • 实现一个简单的shared_ptr

    翻看以前的代码的时候发现一个shared_ptr的简单实现。

    我记得是网上的一篇例子(好像改了一点),但是又懒得找出处了 ╮(╯▽╰)╭。

    觉得这份代码足以用来初步了解shared_ptr的实现了。

    一般来说,智能指针的实现需要以下步骤:

    1.一个模板指针T* ptr,指向实际的对象。

    2.一个引用次数(必须new出来的,不然会多个shared_ptr里面会有不同的引用次数而导致多次delete)。

    3.重载operator*和operator->,使得能像指针一样使用shared_ptr。

    4.重载copy constructor,使其引用次数加一。

    5.重载operator=,如果原来的shared_ptr已经有对象,则让其引用次数减一并判断引用是否为零(是否调用delete)。

     然后将新的对象引用次数加一。

    6.重载析构函数,使引用次数减一并判断引用是否为零(是否调用delete)。

    源码如下:

    复制代码
     1 #ifndef __SHARED_PTR_
     2 #define __SHARED_PTR_
     3 
     4 template <typename T>
     5 class shared_ptr {
     6 public:
     7     shared_ptr(T* p) : count(new int(1)), _ptr(p) {}
     8     shared_ptr(shared_ptr<T>& other) : count(&(++*other.count)), _ptr(other._ptr) {}
     9     T* operator->() { return _ptr; }
    10     T& operator*() { return *_ptr; }
    11     shared_ptr<T>& operator=(shared_ptr<T>& other)
    12     {
    13         ++*other.count;
    14         if (this->_ptr && 0 == --*this->count)
    15         {
    16             delete count;
    17             delete _ptr;
    18         }
    19         this->_ptr = other._ptr;
    20         this->count = other.count;
    21         return *this;
    22     }
    23     ~shared_ptr()
    24     {
    25         if (--*count == 0)
    26         {
    27             delete count;
    28             delete _ptr;
    29         }
    30     }
    31     int getRef() { return *count; }
    32 private:
    33     int* count;
    34     T* _ptr;
    35 };
    36 
    37 
    38 #endif
    复制代码
     
     
    标签: C++
  • 相关阅读:
    activiti app 6.0 乱码
    扫盲--CRM系统和ERP系统的区别
    GraphQL实战-第四篇-构建开发框架
    GraphQL实战-第三篇-spring Boot 实现
    GraphQL实战-第二篇-java实现及分析
    GraphQL实战-第一篇-GraphQL介绍
    @PostConstruct及跳坑记录
    jmeter元件的介绍
    Docker之5. 容器的操作
    Docker之4. 镜像的操作
  • 原文地址:https://www.cnblogs.com/diegodu/p/9166634.html
Copyright © 2011-2022 走看看