Andrey Semashev | 11 Oct 17:44
Picon

Re: [shared_ptr] Ticket 2126 status?

Peter Dimov wrote:
> Andrey Semashev:
> 
>> Is the ticket 2126:
>>
>> http://svn.boost.org/trac/boost/ticket/2126
>>
>> actually fixed in trunk? The ticket is still open, but my code that uses
>> enable_shared_from_this and make_shared runs fine on trunk.
> 
> Interesting. No, I don't believe that trunk is OK. The constructor
> support just masks the problem. Try for example the following test:

I tried to dig the code here and there. It seems like calling
sp_accept_owner for the constructed object would settle the problem. I
modified make_shared.hpp accordingly and tried your test on Linux (GCC
4.3), and it passed without errors. I also tried the
make_shared_test.cpp test and it also passed.

Please, find the patch attached. Is it valid?

Index: make_shared.hpp
===================================================================
--- make_shared.hpp	(revision 48913)
+++ make_shared.hpp	(working copy)
@@ -98,12 +98,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T();
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 template< class T, class A > boost::shared_ptr< T > allocate_shared( A const & a )
@@ -112,12 +114,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T();
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 #if defined( BOOST_HAS_VARIADIC_TMPL ) && defined( BOOST_HAS_RVALUE_REFS )
@@ -130,12 +134,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T( detail::forward<Args>( args )... );
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 template< class T, class A, class... Args > boost::shared_ptr< T > allocate_shared( A const & a, Args && ...
args )
@@ -144,12 +150,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T( detail::forward<Args>( args )... );
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 #else
@@ -163,12 +171,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T( a1 );
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 template< class T, class A, class A1 >
@@ -178,12 +188,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T( a1 );
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 template< class T, class A1, class A2 >
@@ -193,12 +205,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T( a1, a2 );
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 template< class T, class A, class A1, class A2 >
@@ -208,12 +222,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T( a1, a2 );
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 template< class T, class A1, class A2, class A3 >
@@ -223,12 +239,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T( a1, a2, a3 );
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 template< class T, class A, class A1, class A2, class A3 >
@@ -238,12 +256,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T( a1, a2, a3 );
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 template< class T, class A1, class A2, class A3, class A4 >
@@ -253,12 +273,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T( a1, a2, a3, a4 );
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 template< class T, class A, class A1, class A2, class A3, class A4 >
@@ -268,12 +290,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T( a1, a2, a3, a4 );
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 template< class T, class A1, class A2, class A3, class A4, class A5 >
@@ -283,12 +307,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T( a1, a2, a3, a4, a5 );
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
@@ -298,12 +324,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T( a1, a2, a3, a4, a5 );
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
@@ -313,12 +341,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T( a1, a2, a3, a4, a5, a6 );
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >
@@ -328,12 +358,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T( a1, a2, a3, a4, a5, a6 );
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
@@ -343,12 +375,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
@@ -358,12 +392,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
@@ -373,12 +409,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
@@ -388,12 +426,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
@@ -403,12 +443,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8,
class A9 >
@@ -418,12 +460,14 @@

     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );

-    void * pv = pd->address();
+    T * pv = static_cast< T * >(pd->address());

     new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
     pd->set_initialized();

-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    boost::shared_ptr< T > p( pt, pv );
+    boost::sp_accept_owner( &p, pv );
+    return p;
 }

 #endif
_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Gmane