智能指针的设计理念
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内核设计思想》