Android之智能指针

什么是智能指针

智能指针是C++中的一个概念,通过基于引用计数的方法,解决对象的自动释放的问题。

在Android的源代码中,经常会看到形如:sp< xxx>、wp< xxx>这样的类型定义,这其实是Android中的智能指针。

在C++编程中,有两个很让人头痛
的问题:

  1. 忘记释放动态申请的对象从而造成内存泄露;
  2. 是对象在一个地方释放后,又在别的地方被使用,从而引起内存访问错误。

程序员往往需要花费很大精力进行精心设计,以避免这些问题的出现。

在使用智能指针后,动态申请的内存将会被自动释放(有点类似Java的垃圾回收),不需要再使用delete来释放对象,也不需要考虑一个对象是否已经在其它地方被 释放了,从而使程序编写工作减轻不少,而程序的稳定性大大提高。

Android智能指针实现的源码路径:
frameworks/rs/cpp/util/StrongPointer.h
frameworks/rs/cpp/util/RefBase.h

强指针sp(strong pointer)

强指针与一般意义的智能指针概念相同,通过引用计数来记录有多少使用者在使用一个 对象,如果所有使用者都放弃了对该对象的引用,则该对象将被自动销毁。
代码:

template 
class sp
{
public:
    inline sp() : m_ptr(0) { }

    sp(T* other);  // NOLINT, implicit
    sp(const sp& other);
    template sp(U* other);  // NOLINT, implicit
    template sp(const sp& other);  // NOLINT, implicit

    ~sp();

    // Assignment

    sp& operator = (T* other);
    sp& operator = (const sp& other);

    template sp& operator = (const sp& other);
    template sp& operator = (U* other);

    //! Special optimization for use by ProcessState (and nobody else).
    void force_set(T* other);

    // Reset

    void clear();

    // Accessors

    inline  T&      operator* () const  { return *m_ptr; }
    inline  T*      operator-> () const { return m_ptr;  }
    inline  T*      get() const         { return m_ptr; }

    // Operators

    COMPARE(==)
    COMPARE(!=)
    COMPARE(>)
    COMPARE(<)
    COMPARE(<=)
    COMPARE(>=)

private:
    template friend class sp;
    template friend class wp;
    void set_pointer(T* ptr);
    T* m_ptr;
};

弱指针wp(weak pointer)

弱指针也指向一个对象,但是弱指针仅仅记录该对象的地址,不能通过弱指针来访问该对象,也就是说不能通过弱智真来调用对象的成员函数或访问对象的成员变量。

要想访问弱指针所指向的对象,需首先将弱指针升级为强指针(通过
wp类所提供的promote()方法)。

弱指针所指向的对象是有可能在其它地方被销毁的,如果对象已经被销毁,wp的promote()方法将返回空指针,这样就能避免出现地址访问错的情况。

代码:

template 
class wp
{
public:
    typedef typename RefBase::weakref_type weakref_type;

    inline wp() : m_ptr(0) { }

    explicit wp(T* other);
    wp(const wp& other);
    explicit wp(const sp& other);
    template explicit wp(U* other);
    template explicit wp(const sp& other);
    template explicit wp(const wp& other);

    ~wp();

    // Assignment

    wp& operator = (T* other);
    wp& operator = (const wp& other);
    wp& operator = (const sp& other);

    template wp& operator = (U* other);
    template wp& operator = (const wp& other);
    template wp& operator = (const sp& other);

    void set_object_and_refs(T* other, weakref_type* refs);

    // promotion to sp

    sp promote() const;

    // Reset

    void clear();

    // Accessors

    inline  weakref_type* get_refs() const { return m_refs; }

    inline  T* unsafe_get() const { return m_ptr; }

    // Operators

    COMPARE_WEAK(==)
    COMPARE_WEAK(!=)
    COMPARE_WEAK(>)
    COMPARE_WEAK(<)
    COMPARE_WEAK(<=)
    COMPARE_WEAK(>=)

    inline bool operator == (const wp& o) const {
        return (m_ptr == o.m_ptr) && (m_refs == o.m_refs);
    }
    template
    inline bool operator == (const wp& o) const {
        return m_ptr == o.m_ptr;
    }

    inline bool operator > (const wp& o) const {
        return (m_ptr == o.m_ptr) ? (m_refs > o.m_refs) : (m_ptr > o.m_ptr);
    }
    template
    inline bool operator > (const wp& o) const {
        return (m_ptr == o.m_ptr) ? (m_refs > o.m_refs) : (m_ptr > o.m_ptr);
    }

    inline bool operator < (const wp& o) const {
        return (m_ptr == o.m_ptr) ? (m_refs < o.m_refs) : (m_ptr < o.m_ptr);
    }
    template
    inline bool operator < (const wp& o) const {
        return (m_ptr == o.m_ptr) ? (m_refs < o.m_refs) : (m_ptr < o.m_ptr);
    }
                         inline bool operator != (const wp& o) const { return m_refs != o.m_refs; }
    template inline bool operator != (const wp& o) const { return !operator == (o); }
                         inline bool operator <= (const wp& o) const { return !operator > (o); }
    template inline bool operator <= (const wp& o) const { return !operator > (o); }
                         inline bool operator >= (const wp& o) const { return !operator < (o); }
    template inline bool operator >= (const wp& o) const { return !operator < (o); }

private:
    template friend class sp;
    template friend class wp;

    T*              m_ptr;
    weakref_type*   m_refs;
};


参考

Android智能指针SP WP使用方法介绍

你可能感兴趣的:(Android之智能指针)