an intrusive smart pointer
hi,
I am using an adhoc intrusive templated smart pointer implementation and
I stumbled upon a small implementation quirk.
details:
- intrusive: requires Ref and Unref to be defined on target type
- assumes refcount is initialized to one by constructor of target type
The above details make it impossible for me to write code like this:
Ptr<T> p = new T ();
because the above code initializes the refcount to 1 in T::T and invokes
Ptr<T>::Ptr (T *p) which increments the refcount a second time. Instead,
I have to write:
Ptr<T> p = Ptr<T> (new T (), false); // avoid adding an extra refcount
or, the following:
Ptr<T> p = Create<T> ();
which hides the slightly scary bool argument behind a homemade Create
method.
However, I really would like to support the direct new syntax:
Ptr<T> p = new T ();
A simple way to support this would be to initialize the refcount to zero
in T::T. However, when I attempted to do this, I found the following
issue. If you write:
T::T ()
{
DoSomething (this);
}
void
DoSomething (Ptr<T> p)
{}
The call to DoSomething is going to increment and decrement the refcount
to one and back to zero, hence, triggering a delete before the object is
fully constructed.
So, I really wonder if it is possible to support both the direct new
syntax and calls to DoSomething from within the constructor.
regards,
Mathieu
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]