android 智能指针流程




mBase指向RefBase

mRefs指向weakref_impl

感觉上,智能指针用在new出来的对象。因为new是分配一快内存,返回的是一个指针,系统也不知道用户不再用这个内存。所以只有用户显式的释放内存,

这样有可能造成内存。所以,要把这个指针加以管理。new出来的对象的缺点是生存周期太长,而且只能用显式的delete。所以要,构造一个放在堆栈中的对象管理这个指针。

这个对象就是智能指针了。当智能指针的生命周期结束时,系统会自动调用智能指针的析构函数,在这个析构函数添加释放要管理的指针。一举两得。很巧妙。  

还有更巧妙的:

比如

sp<AMessage> meta = parseBuffer->meta();

meta->findInt64("timeUs", &timeUs)

meta明明是一个对象,怎么能用“->”

是因为sp类把“->”操作符重载了。wp类没有‘->’重载符,所以不能操作对象。

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

这下好了,meta可以像普通的指针那样用了。

我还是有一个疑问,既然智能指针这么好,怎么c++原生不支持呢?


深入体会一下sp的魅力

显存释放相关代码可参考
"frameworks/native/libs/gui/SurfaceTextureClient.cpp" 844 lines --79%--

void SurfaceTextureClient::freeAllBuffers() {
    for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
        mSlots[i].buffer = 0;
    }
}

buffer是sp类型。

=0调用的重载符如下:

template<typename T>          
sp<T>& sp<T>::operator = (T* other)                                                                                          
{
    if (other) other->incStrong(this);
    if (m_ptr) m_ptr->decStrong(this);
    m_ptr = other;
    return *this;
}

other要加强引用,因为又有一个指针指向对象。

m_ptr要减强应用,因为被赋值的sp,不再指向原来的对象,所以引用计数要减一。

太巧妙,把零的情况也考虑进去。

注意阿,重载符号“=”,有四个实现,别找错了。

明白一点东西,很不容易阿。












你可能感兴趣的:(android 智能指针流程)