
2012/1/11 Stewart, Robert <Robert.Stewart@sig.com>
Roman Perepelitsa wrote:
It can be done. In fact, it has already been done. See http://lists.boost.org/boost-users/2011/09/70647.php.
PMFJI, but that code looks suspect. get_pointer() locks the weak_ptr to get a raw pointer from the related shared_ptr, but then the shared_ptr returned by lock() is allowed to go out of scope. Thus, the ptr_adapter returned by get_pointer() holds a transiently valid raw pointer. By the time the pointer is used to call the member function, the last shared_ptr owning the associated memory could release the memory, so the ptr_adapter will have a dangling pointer.
Yes, it's a bug. If ptr_adapter were to hold a shared_ptr instead of a raw pointer, then the
memory could not be released out from under the ptr_adapter. That, of course, doesn't work with get_pointer().
Of course it works with get_pointer. Roman Perepelitsa.