设为首页 加入收藏

TOP

智能指针之 shared_ptr(二)
2018-06-04 08:51:22 】 浏览:412
Tags:智能 指针 shared_ptr
p;   return *(m_ptr);
    }


    //原始指针操作
    T* operator->()
    {
        PTR_ASSERT(m_ptr != NULL);
        return m_ptr;
    }


    operator bool() const
    {
        return m_ptr != NULL;
    }


    //取得原始指针
    T* getPointer()
    {
        PTR_ASSERT(m_ptr != NULL);
        return m_ptr;
    }


    //获得引用计数
    int getRefCount()
    {
        PTR_ASSERT(m_iRefCount != NULL);
        return *m_iRefCount;
    }


   
private:
    void RefCountInit()
    {
        m_iRefCount = new int(1);
    }


    void RefCountIncrease()
    {
        if (m_iRefCount != NULL)
        {
            ++(*m_iRefCount);
        }
    }


    void RefCountDecrease()
    {
        if (m_iRefCount != NULL && --(*m_iRefCount) == 0)
        {
            m_deleter(m_ptr);
            delete m_iRefCount;
            m_ptr = NULL;
            m_iRefCount = NULL;
        }
    }


private:
    int* m_iRefCount; //引用计数


    T*  m_ptr; //对象指针


    deleter m_deleter; //删除器
};


_SMART_PTR_END
#endif // !__SHARE_PTR_H__


main函数测试


#include "share_ptr.h"
#include <memory>


class Test
{
public:
    Test()
    {
        std::cout << "construct.." << std::endl;
    }


    void method()
    {
        std::cout << "welcome Test.." << std::endl;
    }


    ~Test()
    {
        std::cout << "destruct.." << std::endl;
    }
};


int main()
{
    Test* t1 = new Test();


    _SMART_PTR shared_ptr<Test> shptr(t1);


    _SMART_PTR shared_ptr<Test> shptr1(shptr);


    _SMART_PTR shared_ptr<Test> shptr2 = shptr1;


    std::cout << "RefCount: " << shptr2.getRefCount() << std::endl;


    shptr2->method();


    (*shptr2).method();


    if (shptr2)
    {
        std::cout << "ptr is exit " << std::endl;
    }


 


    return 0;
}


测试最后打印:


[linuxidc@yejy cmake-00]$ ./smartptr
construct..
RefCount: 3
welcome Test..
welcome Test..
ptr is exit
destruct..
[linuxidc@yejy cmake-00]$


shared_ptr主要需实现的功能点如下(以下总结):


1.没有参数构造的时候,初始化为空,即对象和引用计数的两个指针都为0


2.使用指针为参数构造时,拥有此指针,在没有智能指针指向它时进行析构


3.智能指针复制时,两个智能指针共同拥有内部指针,引用计数同时+1


4.智能指针可以使用智能指针或普通指针重新赋值。重载=操作符,对于智能指针赋值,需要考虑是否自赋值,以避免将自身析构了后再重新赋值,而普通指针赋值给智能指针,则不需要考虑自赋值,因为两者本身是两个类型


5.获得底层指针的访问,定义getPtrPointer()和getPtrCounter()来分别返回底层指针和引用计数,定义operator bool()来处理智能指针隐式转换为bool的情况


6.重载->和×操作符 ,来实现与普通指针相同的指针访问


7.需要支持隐式指针类型转换,static_cast不支持

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇SpringBoot自动装配深入理解 下一篇Python 人脸识别 OpenCV (haarcas..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目