我指的是Refbase.hRefbase.cppStrongPointer.h

在Android强指针实现中,任何基于强指针的对象都必须继承refbase,即

sp<TheClass> theObj // TheClass must inherit from class RefBase


可以在sp方法之一的代码中看到此要求:

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


为了使对incStrongdecStrong的调用不失败。 。 。 othermPtr必须继承了RefBase



为什么要实现sp,从而要求其管理的obj是RefBase的子级?甚至没有办法在编译时甚至运行时强制执行此要求。 (也许if(type()...

Std library doesn't have such a requirement

...
经过进一步思考,是否可以提供灵活性的答案?
如果是,这如何提供灵活性?

最佳答案

这样可以节省内存分配。当你写:

std::shared_ptr<Foo> pFoo{new Foo(bar)};


pFoo实际上有一个指向共享数据结构(分配在堆上)的指针,该结构具有引用计数器,以及一个指向实际Foo对象的指针。通过使对象派生自RefBase,您可以将引用计数嵌入对象本身(节省额外的内存分配)。

有趣的是,从C ++ 11开始,您可以使用std::make_shared<Foo>避免额外的内存分配,这将执行单个内存分配并在其中构造共享数据结构和Foo对象。

没有编译时检查RefBase派生的事实是粗心。 m_ptr应该已经声明为RefBase *m_ptr,然后operator *(等)应该已经对T*执行了static_cast。实际上,我可能会使sp<T>sp_base继承,而T将比较运算符设为public,而其他功能则设为protected。

编辑

再三考虑,有很多编译时间检查。如果incStrong没有RefBase成员,则编译将失败,并且几乎可以肯定不会编译,除非它是从T*派生的。我仍然认为将RefBase*转换为会是更好的检查方法,但是在那里可能已经足够了。

09-26 04:13