Re: [Boost-bugs] [Boost C++ Libraries] #2481: make_shared and allocate_shared friendship

Subject: Re: [Boost-bugs] [Boost C++ Libraries] #2481: make_shared and allocate_shared friendship
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2009-02-04 13:16:21


#2481: make_shared and allocate_shared friendship
-----------------------------------------------------+----------------------
  Reporter: Michael Marcin <mike.marcin_at_[hidden]> | Owner: pdimov
      Type: Feature Requests | Status: new
 Milestone: Boost 1.38.0 | Component: smart_ptr
   Version: Boost 1.36.0 | Severity: Problem
Resolution: | Keywords:
-----------------------------------------------------+----------------------
Changes (by Jonathan Wakely <jwakely.boost_at_[hidden]>):

 * cc: jwakely.boost_at_[hidden] (added)

Comment:

 Right, you don't even need the make_shared_access extension to open that
 hole, the design is compromised if you declare make_shared or
 allocate_shared as a friend.

 Given:
 {{{
 class MustUseFactory {
   MustUseFactory() { }
 public:
   static shared_ptr<MustUseFactory> create();
 };
 }}}
 You can still use make_shared by using aliasing:
 {{{
 shared_ptr<MustUseFactory> MustUseFactory::create()
 {
     typedef aligned_storage<sizeof(MustUseFactory)> Storage;
     shared_ptr<Storage> storage = make_shared<Storage>();
     MustUseFactory* p = new (storage->address()) MustUseFactory();
     return shared_ptr<MustUseFactory>(storage, p);
 }
 }}}

 This doesn't work with enable_shared_from_this, I leave that as an
 exercise for the reader ;-)

-- 
Ticket URL: <https://svn.boost.org/trac/boost/ticket/2481#comment:3>
Boost C++ Libraries <http://www.boost.org/>
Boost provides free peer-reviewed portable C++ source libraries.

This archive was generated by hypermail 2.1.7 : 2017-02-16 18:49:59 UTC