zoukankan      html  css  js  c++  java
  • C++智能指针简单实现

    share_ptr 简单实现:

    #include <iostream>
    
    using namespace std;
    
    template<class T>
    class SmartPtr {
    public:
        SmartPtr(T* ori_ptr);
        ~SmartPtr();
        SmartPtr(SmartPtr<T>& ori_ptr);
        SmartPtr<T>& operator=(const SmartPtr<T>& ori_ptr);
    
    private:
        T* ptr;
        int* count;
    };
    
    template<class T>
    SmartPtr<T>::SmartPtr(T* ori_ptr) {
        count = new int(1);
        ptr = ori_ptr;
    }
    
    template<class T>
    SmartPtr<T>::~SmartPtr() {
        if (--(*count) <= 0)
        {
            delete ptr;
            delete count;
            ptr = nullptr;
            count = nullptr;
            cout << "object was destroied" << endl;
        }
    }
    
    template<class T>
    SmartPtr<T>::SmartPtr(SmartPtr<T>& ori_ptr) {
        ++(*ori_ptr.count);
        ptr = ori_ptr.ptr;
        count = ori_ptr.count;
    }
    
    // 赋值运算符比较特殊,因为左边操作数本来可能已经指向了另外一个对象
    // 所以在给左边智能指针赋值时,其所指向的对象应该被析构,所以要加一个判断,是否应该析构左边指针的原对象
    template<class T>
    SmartPtr<T>& SmartPtr<T>::operator=(const SmartPtr<T>& ori_ptr) {
        ++(*ori_ptr.count);
        if (--(*count) <= 0) // 释放左边智能指针管理的原对象
        {
            delete ptr;
            delete count;
            cout << " origin object destroied " << endl;
        }
        ptr = ori_ptr.ptr;
        count = ori_ptr.count;
        return *this;
    }
    
    
    int main()
    {
        SmartPtr<int> smartPtr1(new int(1));
        SmartPtr<int> smartPtr11(smartPtr1);
        SmartPtr<int> smartPtr2(new int(2));
        
        smartPtr2 = smartPtr1;
        return 0
    }
    

    weak_ptr简单实现:

  • 相关阅读:
    php 替换二维数组的 key
    全选功能
    向数组中添加含有下标的元素
    判断一个进程是否在执行中
    初识 Nginx
    原生JS中DOM节点相关API合集
    工作中经常用到github上优秀、实用、轻量级、无依赖的插件和库
    Unsupported major.minor version ... JDK具体对应版本
    Scala常用命令
    使用nexus搭建maven私服教程详解
  • 原文地址:https://www.cnblogs.com/qiang-wei/p/12631364.html
Copyright © 2011-2022 走看看