[llvm-commits] [llvm] r47482 - /llvm/trunk/include/llvm/ADT/IntrusiveRefCntPtr.h
Chris Lattner
clattner at apple.com
Tue Feb 26 09:52:23 PST 2008
On Feb 26, 2008, at 8:44 AM, Ted Kremenek wrote:
>
> On Feb 25, 2008, at 1:22 PM, Chris Lattner wrote:
>
>>> + template <class Derived>
>>> + class RefCountedBaseVPTR {
>>
>> Why do you need this class? The only way a ref counted object should
>> be destroyable is through Release(), which should handle the case
>> when
>> "Derived" itself has a virtual dtor, no?
>
> I suppose that is true since "RefCountedBase::Release" performs a
> static cast to the derived class.
Right.
> The advantage of RefCountedBaseVPTR is that classes that derive from
> it (as opposed to deriving from RefCountedBase) can have the
> compiler *enforce* that they are never statk allocated.
But we want this for RefCountedBase also, right?
> By making the dstor protected in RefCountedBaseVPTR, an object
> cannot be stack allocated (although subclasses have to make their
> dstor protected as well for this to work). With RefCountedBase,
> clients must make the dstor public in order for the static cast with
> the Release method to work. Thus clients that are already using a
> VPTR can engineer extra safety into their code by having the
> compiler enforce that objects derived from RefCountedBaseVPTR are
> never stack allocated; this same trick cannot be done with
> RefCountedBase (at least as far as I can tell without making
> RefCountedBase<Derived> a friend class of Derived).
I don't really understand how having a vptr is relevant here. access
control doesn't care about virtualness. In any case, is the
complexity worth supporting for marginal utility?
-Chris
More information about the llvm-commits
mailing list