Re: an intrusive smart pointer
In article <memo.20080101221630.3076A@brangdon.cix.compulink.co.uk>,
Dave Harris <brangdon@ntlworld.com> wrote:
cbarron413@adelphia.net (Carl Barron) wrote (abridged):
My point is that 99% of your problem is solved as is in
intrusive_ptr and the only apparent problem of using it is that
the ctor taking a T * has a default parameter to add to the
reference count and you want that to default to be false. So
the solution is write a smart ptr similiar to intrusive_ptr<T>
but have a ctor that defaults the bool to false instead of true.
So coding your smart ptr should now be fairly easy.
Thanks for explaining.
That approach seems rather error prone to me. Code like:
T *p0 = new T;
Ptr<T> p1 = p0;
Ptr<T> p2 = p0;
will compile and will result in the object being deleted twice.
-- Dave Harris, Nottingham, UK.
so will the following TR1 code:
{
T *p = new T;
shared_ptr<T> p1(p);
shared_ptr<T> p2(p);
}
where T is any type, :)
The only way to avoid this in your Ptr<T> I can think of is to
have a flag in T that a Ptr<T> has been constructed from a T *
pointing to this object, and acting accordingly with regard to
updating the reference count.
{
Ptr<T> & operator = (T *p)
{
ptr_releas(this); // destruct if out of count
ptr_p = p; // store p in Ptr<T>
if(ptr_ctored(p))
ptr_add_ref(p); // if not first Ptr increment count
else
ptr_set_ctored(p); // mark p as having constructed a Ptr;
return *this;
}
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]