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,不再指向原来的对象,所以引用计数要减一。
太巧妙,把零的情况也考虑进去。
注意阿,重载符号“=”,有四个实现,别找错了。
明白一点东西,很不容易阿。