
2009/2/9 Ion Gaztañaga
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.