Boost logo

Boost Users :

From: Niklas Wiberg (nwlists-boostusers_at_[hidden])
Date: 2005-01-17 05:00:27


Hi,
I have the following situation:
In the constructor body of class A, I need to call functions that take a
shared_ptr<A> as a parameter. These functions do not store the
shared_ptr<A>, but in some situations a weak_ptr<A>.
There is not yet any shared_ptr owning the A instance, since this is
during A construction...

At first, I thought using a shared_ptr<A> tmpThis(this, NullDeleter())
was a good idea.
But when I later on (when another shared_ptr actually owns the A
instance) want to use shared_from_this on A, I get an exception since
the use_count of the internal weak_ptr is based on the first temporary
shared_ptr that I used during construction (with the NullDeleter).

Am I correct in my assumption that the internal weak_ptr in
enable_shared_from_this is initialized by the first shared_ptr and that
will prevent any later use of shared_from_this when I have another
shared_ptr (with a default deleter) owning the element?

I guess that a static create function would solve the problem, but
changing that would be quite a big undertaking in this particular case
so I thought I'd check if someone knows a simple solution to this...

I added a small example code snipped below...

Best regards,
Niklas

Example:

void foo(shared_ptr<A> a);
void otherFunction(shared_ptr<A> a);

class A : public enable_shared_from_this<A> {
   A() {
     // Can't use shared_from_this since no shared_ptr owns this yet
     shared_ptr<A> thisTmp(this, NullDeleter());
     foo(thisTmp);
   }

   bar() {
     otherFunction(shared_from_this()); // Throws exception...
   }
};

int main() {
   shared_ptr<A> a(new A());
   a->otherFunction();
   ...
}


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net