2009/2/9 Ion Gaztaņaga <igaztanaga@gmail.com>
Emil Dotchevski wrote:
You're probably doing something wrong, shared_ptr doesn't require
virtual destructor to call the correct destructor. Here is a working
example: http://codepad.org/sktELTDk

Yes, it needs a virtual destructor if it's a shared_ptr to the base class, otherwise you can't achieve type erasure. This virtual call does not happen with boost::interprocess::shared_ptr because virtuality is forbidden in shared memory.

Regards,

Ion

In boost::shared_ptr doc
http://www.boost.org/doc/libs/1_38_0/libs/smart_ptr/shared_ptr.htm#Members 
It's said :
"This constructor has been changed to a template in order to remember the actual pointer type passed. The destructor will call delete with the same pointer, complete with its original type, even when T does not have a virtual destructor, or is void."

So I thought Emil is right and that's why I tried :

base_shared_ptr baseSP = make_managed_shared_ptr(segment.construct<derived>(anonymous_instance)(2,3.0), segment);

I even tried something like this :
base_shared_ptr baseSP = base_shared_ptr(segment.construct<derived>(anonymous_instance)(1,3.0),
                                     segment.get_allocator<void>(),
                                     segment.get_deleter<derived>() );

But this does not compile. 
But as boost::interprocess::shared_ptr is based on boost::shared_ptr I thought it could work....

Is it really impossible to achieve the same behavior in boost::interprocess::shared_ptr than in boost::shared_ptr ?
I looked at the code (of both shared_ptr.hpp) and I don't see where is the lock.
But I'm surely not enough skilled to write the right ctor by myself. 

But It would solve my problem, isnt'it  ?
Gaetan
PS : By the way, thanks Ion and others for this great work on boost in general and the Interprocess library in particular.