Re: [Boost-bugs] [Boost C++ Libraries] #12220: Memory leak in future::then()

Subject: Re: [Boost-bugs] [Boost C++ Libraries] #12220: Memory leak in future::then()
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2016-08-18 19:23:37

#12220: Memory leak in future::then()
  Reporter: valentin.milea@… | Owner: viboes
      Type: Bugs | Status: assigned
 Milestone: To Be Determined | Component: thread
   Version: Boost 1.61.0 | Severity: Regression
Resolution: | Keywords: memory leak future then

Comment (by BloodyRookie):

 "static_shared_from_this(this) is used as parameter of the run function
 and the parameter is released when the function ends, isn't it?"

 Where is the parameter released?

 Suppose I have code like this

    auto f = boost::make_ready_future<int>(41).then([](boost::future<int>)
 { return 42; });
    f.get(); // wait for the future to complete

 Then at some point

 this->thr_ = thread(&future_async_shared_state::run,
 static_shared_from_this(this), boost::forward<Fp>(f));

 Is called. The thread ctor calls


 a1 is


 The result of boost::bind is stored in the thread_data member (actually
 the pointer thread_data_ptr keeps it alive)

 After the future completes the situation has not changed, nothing is
 released imo.
 In the debugger I can see the following:

 There are 2 strong references on the shared state, one is from the
 variable f but the other one is from the creation of the thread which is
 attached to the future. The dtor of the future is never called.

 If I comment out the BOOST_THREAD_FUTURE_BLOCKING flag definition then at
 the same break point there is only 1 strong reference and the dtor of the
 future is called.

Ticket URL: <>
Boost C++ Libraries <>
Boost provides free peer-reviewed portable C++ source libraries.

This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:20 UTC