Boost logo

Boost Users :

Subject: Re: [Boost-users] [bind] Doubt regarding the use of shared_ptr with boost.bind
From: Shiou Ming Lee (shiouming.lee_at_[hidden])
Date: 2010-09-24 00:23:31


On Fri, Sep 24, 2010 at 1:37 AM, Marshall Clow <mclow.lists_at_[hidden]>wrote:

> On Sep 23, 2010, at 9:59 AM, Shiou Ming Lee wrote:
>
>
>
> On Thu, Sep 23, 2010 at 9:25 AM, Igor R <boost.lists_at_[hidden]> wrote:
>
>> > m_ioService.post(m_strand.wrap(
>> > boost::bind(&LogWriter::append,
>> > (*logWritersItr), _logMessage, _logLevelString)
>> > ));
>> >
>> > The second param of Bind, (*logWritersItr), is a shared_ptr of
>> LogWriter's
>> > subclass. The signature of LogWriter::append() is as following:
>> >
>> > virtual void append(const std::string& _logMessage, const std::string&
>> > _logLevelString) = 0;
>> >
>> > Base on document at
>> > http://www.boost.org/doc/libs/1_44_0/libs/bind/bind.html, the way I use
>> bind
>> > will duplicate a copy of that shared_ptr. Any idea when will the
>> duplicated
>> > shared_ptr become invalid so that the reference count decreases by one?
>>
>> bind() takes your shared_ptr by value, so it won't become "invalid".
>> After io_service executes your functor, it will be destroyed, so all
>> its internal copies of that shared_ptr will be destroyed as well.
>> _______________________________________________
>> Boost-users mailing list
>> Boost-users_at_[hidden]
>> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>
>
> I think I don't quite completely understand functor.., is it by C++ that a
> functor will be destroyed automatically once executed? Or is this a feature
> from boost.bind?
>
>
> I think that you're thinking too hard about this.
> It's not a feature from boost.bind, it's just standard C++ lifetime rules.
>
> 1) The shared_ptr is copied into the bind object. (use count for the
> shared_ptr ++)
> 2) The bind object is passed (by value) to m_ioService.post. (use count
> for the shared_ptr++)
> *) The original bind object gets destroyed (goes out of scope, whatever)
> (use count for the shared_ptr--)
> *) When m_ioService.post returns, the copy of the bind object that was
> passed to it is destroyed (use count for the shared_ptr--)
>
> the last two are '*'s rather than 3/4 since I don't remember the order (and
> it doesn't really matter, either). ;-)
>
> If m_ioService.post makes copies of the functor and/or the shared pointer
> internally, then the use count for the shared pointer will be incremented
> for each copy, and decremented when a copy is destroyed.
>
>
> -- Marshall
>
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>

Got it. Thanks Igor and Marshall. :)



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