智能指针笔记

266 阅读3分钟

智能指针的设计理念

c/c++常见的指针问题

  • 指针没有初始化
  • new了对象之后没有及时delete
  • 野指针
template<typename T>
class SmartPointer
{
	inline SmartPointer() : m_ptro(0){} //置空解决没有初始化问题
    ~SmartPointer();
    SmattPointer& operator = (T* other);//重载运算符
    
private:
	T* m_ptr; //指向object对象
}

template<typename T>
SmartPointer<T> &SmatrtPointer<T>::operator = (T* other)
{
	if(other != null)
    {
    	m_ptr = other;/*指向内存对象*/
        other-> incStrong();/*主动增加计数值*/
    }
}
template<typename T>
SmartPointer<T>::~SmartPointer()
{
	if (m_ptr) m_prt->decStrong();//当SmartPointer析构时,调用decStrong来释放引用
}

小知识
模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。
模板是创建泛型类或函数的蓝图或公式。
类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行

具备计数器功能的Object的父类

template <class T>
class LightRefBase
{
public:
	inline LightRefBase() : mCount(0){ }
    inline void incStrong() const{/*增加引用计数*/
    	android_atomic_inc(&mCount);
    }
    inline void decStrong() const{
    	if(android_atomic_dec(&mCount) == 1){/*减少引用计数*/
        	delete staic_cast<const T*>(this);/*删除内存对象*/
        }
    }
protected:
	inline ~LigntRefBase() { }
    
private:
	mutable volatile int32_t mCount;/*引用计数值*/
}

小知识
mutable 说明符仅适用于类的对象,mutable 成员可以通过 const 成员函数修改。

Android中的智能指针实现:包括强弱指针两种

强指针

小知识
类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
声明类 ClassTwo 的所有成员函数作为类 ClassOne 的友元,需要在类 ClassOne 的定义中放置如下声明:

friend class ClassTwo;

强指针的实现和上面的例子基本相同,这里不再赘述

弱指针

两个对象相互引用产生的问题,导致两个对象的引用计数都不为零
弱指针必须先升级为强指针,才能访问它所指的目标对象
sp和wp区别:

  • 除了指向目标对象的m_ptr外,wp另外有一个m_refs指针,类型为weaker_type。
  • 没有重载->,*等运算符
  • 有一个promote方法来将wp提升为sp。
  • 目标对象的父类不是LightRefBase,而是RefBase

负责对象之间的解引用。如果子类保存有父指针,父类保存有子指针,在析构的时候子类先析构,但是父类保有子类的引用,导致引用计数不为0,无法删除子类;然后父类析构,子类保有父类的引用计数,父类也无法删除,这时候需要使用wp避免出现这种情况。和sp 一样 wp重载了 操作符“=” 调用 incWeak, 在析构的时候 decWeak。 在RefBase 里面有两个变量mStrong, mWeak 分别保存强弱引用计数,只要强引用计数为0,强制delete。 举个例子: 我们定义两个类A B, 后析构的B使用wp类型的指针保存A,在析构的时候如果弱引用类型不为0,只要强引用类型为0,强制delete。A先析构,强引用类型为0,软引用类型为1,强制delete, 这样B的强引用类型也变为1,B析构的时候执行完del 后强引用类型为0,delete
这一段摘自《Android强弱指针分析》

看了一天还是没有对弱指针运行原理理解透彻,仅在此一记,带学习C++时在来详细研究,对智能指针的学习是为了学习Binder打下一些基础,想来理解这么多也差不多够用了
这里只是我个人学习提炼的一些要点,详细学习建议阅读书籍,并自己提取知识要点

参考《深入理解Android内核设计思想》