$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [Boost-users] [SmartPtr] enable_shared_from_raw / weak_from_raw remains not associated
From: Frank Mori Hess (fmh6jj_at_[hidden])
Date: 2013-05-16 14:09:58
On Thu, May 16, 2013 at 5:58 AM, Slava
<Viatcheslav.Sysoltsev_at_[hidden]> wrote:
> I'm converting existing code with parent-child object tree to boost
> shared_ptr/weak_ptr with parents having [now shared] ownership over the
> children and children having weak reference to the parent. In the existing
> code a parent usually becomes the children as constructor parameters, and
> thus I have to extract the weak_ptr to "this" in constructor, which does not
> work with current boost::enable_shared_from_this implementation. So I am
> looking to enable_shared_from_raw alternative, which is promising, but
> unfortunately does not quite work for my case. Here is a small example
> demonstrating the issue:
> struct Parent : public boost::enable_shared_from_raw
> {
>     Parent(boost::shared_ptr<Child> _child)
>     {
>         std::cout << "Construct Parent" << std::endl;
>         this->child = _child;
>         this->child->parent = boost::weak_from_raw(this);
>     }
weak_from_raw() doesn't work until after a shared_ptr has taken
ownership of the object or shared_from_raw()  has been called.  It's
been long enough don't remember what the rationale for this was, or if
there even was a rationale, but the enable_shared_from_raw test case
seems to expect this behavior.  From looking at the code, it seems
like if you just called shared_from_raw prior to calling weak_from_raw
it would work.