ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++智能指针简单实现

2020-04-04 13:02:32  阅读:207  来源: 互联网

标签:count int C++ 智能 template ori 指针 ptr SmartPtr


 

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简单实现:

 

标签:count,int,C++,智能,template,ori,指针,ptr,SmartPtr
来源: https://www.cnblogs.com/qiang-wei/p/12631364.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有