WebKit中OwnPtr和PassOwnPtr的使用

OwnPtr和RefPtr有什么区别呢?

 

看他们的构造函数和析构函数

RefPtr:

PassRefPtr<Frame> Frame::create(Page* page, HTMLFrameOwnerElement* ownerElement, FrameLoaderClient* client)
{
RefPtr<Frame> frame = adoptRef(new Frame(page, ownerElement, client));
if (!ownerElement)
page->setMainFrame(frame);
return frame.release();
}

template<typename T> inline PassRefPtr<T> adoptRef(T* p)
{
adopted(p);
return PassRefPtr<T>(p, true);
}

 

inline void adopted(RefCountedBase* object)
{
if (!object)
return;
ASSERT(!object->m_deletionHasBegun);
object->m_adoptionIsRequired = false;
}

 

private:
// adopting constructor
PassRefPtr(T* ptr, bool) : m_ptr(ptr) { }

mutable T* m_ptr;

template<typename T> inline RefPtr<T>& RefPtr<T>::operator=(const PassRefPtr<T>& o)
{
T* ptr = m_ptr;
m_ptr = o.leakRef();
derefIfNotNull(ptr);
return *this;
}

 

template<typename T> REF_DEREF_INLINE void derefIfNotNull(T* ptr)
{
if (LIKELY(ptr != 0))
ptr->deref();
}

 

ALWAYS_INLINE ~RefPtr() { derefIfNotNull(m_ptr); }

析构的时候会调用deref减少引用计数。

看看OwnPtr:

        OwnPtr<TiledBackingStore> m_tiledBackingStore;

void Frame::setTiledBackingStoreEnabled(bool enabled)
{
if (!enabled) {
m_tiledBackingStore.clear();
return;
}
if (m_tiledBackingStore)
return;
m_tiledBackingStore = adoptPtr(new TiledBackingStore(this));
if (m_view)
m_view->setPaintsEntireContents(true);
}

template<typename T> inline PassOwnPtr<T> adoptPtr(T* ptr)
{
return PassOwnPtr<T>(ptr);
}

template<typename T> inline OwnPtr<T>& OwnPtr<T>::operator=(const PassOwnPtr<T>& o)
{
PtrType ptr = m_ptr;
m_ptr = o.leakPtr();
ASSERT(!ptr || m_ptr != ptr);
deleteOwnedPtr(ptr);
return *this;
}

template <typename T> inline void deleteOwnedPtr(T* ptr)
{
typedef char known[sizeof(T) ? 1 : -1];
if (sizeof(known))
delete ptr;
}

 

        ~OwnPtr() { deleteOwnedPtr(m_ptr); }

 

可以看到ownptr和passownptr没有管理引用计数的概念,里面也只是对裸指针的管理,传递赋值。

根据上面的代码和ownptr的名字的意义,拥有,所有权,passownptr就是所有权转移的意思。

只有ownptr这个对象独有这个指针指向的对象。

 官网里有句话Think of OwnPtr like RefPtr, except for singularly-owned objects instead of reference-counted objects.”

posted @ 2013-04-15 00:19  JustinYo  阅读(718)  评论(0编辑  收藏  举报