美文网首页C++
智能指针 (3)

智能指针 (3)

作者: 天凝散人 | 来源:发表于2018-06-12 19:18 被阅读0次

上一章:智能指针 (2)
目录

本篇要讲的是如何实现一个共享的指针,前面已经提到过了,通过裸指针浅copy,可以实现指针的共享操作,但是随之而来的问题是谁应该去删除指针所指向的内存。

我们自然而然会想到引用计数,那么,引用计数如何实现呢?关键在于如下几个方面:

(1)在智能指针对象创建时引用计数加1。
(2)在智能指针对象销毁的时候引用计数减1。
(3)引用计数为0时,销毁指针指向的内存。
(4)引用计数必须是所有拥有相同裸指针的对象所共有。

于是,我们可以根据以上思路,写出如下代码:

class SmartIntPtrShared
{
    int* rawPtr_;
    int* counter_;
public:
    SmartIntPtrShared() : rawPtr_(nullptr), counter_(nullptr) {}
    SmartIntPtrShared(int* rawPtr) : rawPtr_(rawPtr), counter_(nullptr)
    {
        if (rawPtr_ != nullptr)
        {
            counter_ = new int(1);
        }
    }
    SmartIntPtrShared(const SmartIntPtrShared& ptr) : rawPtr_(ptr.rawPtr_), counter_(ptr.counter_)
    {
        increaseRef();
    }
    ~SmartIntPtrShared() {release();}
    SmartIntPtrShared& operator=(const SmartIntPtrShared& ptr)
    {
        release();
        rawPtr_ = ptr.rawPtr_;
        counter_ = ptr.counter_;
        increaseRef();
        return *this;
    }

    int* operator->() const {return rawPtr_;}
    int& operator*() const {return *rawPtr_;}
    operator bool () const {return rawPtr_== nullptr;}
    int* get() const {return rawPtr_;}
private:
    void release()
    {
        if (counter_ != nullptr)
        {
            decreaseRef();
            if (*counter_ == 0)
            {
                delete counter_;
                delete rawPtr_;
            }
        }
    }
    void increaseRef()
    {
        if (counter_ != nullptr)
        {
            ++(*counter_);
        }
    }

    void decreaseRef()
    {
        if (counter_ != nullptr)
        {
            ++(*counter_);
        }
    }
};

这里面有几个细节要处理:

(1)counter指针是否为空的判断。
(2)赋值时要把原先的指针先release掉。
(3)counter++时必须为传进来的指针有效。
(4)counter分配内存只存在于SmartIntPtrShared(int* rawPtr)构造时,且rawPtr不会空。

至此,两种的智能指针基本功能已经实现。
C++里面我们可以直接用std::shared_ptr 和 std::unique_ptr.

下一章:智能指针之使用 (3)

目录

相关文章

  • 目录

    智能指针(1) 智能指针(2) 智能指针(3) 智能指针之使用 容器 - vector(1) 容器 - vecto...

  • C++研发工程师笔试题/面试题(1-10)

    1. (1) 简述智能指针的原理;(2)c++中常用的智能指针有哪些?(3)实现一个简单的智能指针。 简述智能指针...

  • 现代 C++:一文读懂智能指针

    智能指针 C++11 引入了 3 个智能指针类型: std::unique_ptr :独占资源所有权的指针。...

  • Android基础--智能指针

    智能指针分为3类为轻量级指针(Light Pointer)、强指针(Strong Pointer)和弱指针(Wea...

  • 智能指针之使用

    上一章:智能指针 (3) 目录 有了智能指针的定义,我们现在来讲讲智能指针如何使用优势以及一些问题。1,uniqu...

  • 智能指针 (3)

    上一章:智能指针 (2)目录 本篇要讲的是如何实现一个共享的指针,前面已经提到过了,通过裸指针浅copy,可以实现...

  • 智能指针到Android引用计数

    智能指针 LightRefBase RefBaseStrongPointerWeakPointer 智能指针 这是...

  • C++面试重点再梳理

    智能指针 请讲一下智能指针原理,并实现一个简单的智能指针 智能指针其实不是一个指针。它是一个用来帮助我们管理指针的...

  • C++11(1)-智能指针

    C++裸指针的内存问题有:1、空悬指针/野指针2、重复释放3、内存泄漏4、不配对的申请与释放 使用智能指针可以有效...

  • 第十六章 string类和标准模板库(2)智能指针模板类

    (二)智能指针模板类 智能指针是行为类似指针的类对象,但这种对象还有其他便于管理内存的功能。 1.使用智能指针 (...

网友评论

    本文标题:智能指针 (3)

    本文链接:https://www.haomeiwen.com/subject/kqwheftx.html