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
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.