C++ 为什么boost::enable_shared_from_raw如此没有文档记录?

C++ 为什么boost::enable_shared_from_raw如此没有文档记录?,c++,boost,shared-ptr,C++,Boost,Shared Ptr,boost smart_ptr库包含两种风格:允许类向自身提供共享_ptr、从_this启用_shared_(也可用于stl的智能指针)和从_raw启用_shared_。对我来说,后者似乎更优越,因为它允许在构造函数中创建共享指针。但是,文档中根本没有提到这个类,它不是根boost/headers的一部分,在google上搜索它通常会在实际的.hpp文件中找到它 boost::enable_shared_from_raw不推荐使用还是以其他方式不适合使用?我遗漏了什么吗?从原始文件启用共享的问题

boost smart_ptr库包含两种风格:允许类向自身提供共享_ptr、从_this启用_shared_(也可用于stl的智能指针)和从_raw启用_shared_。对我来说,后者似乎更优越,因为它允许在构造函数中创建共享指针。但是,文档中根本没有提到这个类,它不是根boost/headers的一部分,在google上搜索它通常会在实际的.hpp文件中找到它


boost::enable_shared_from_raw不推荐使用还是以其他方式不适合使用?我遗漏了什么吗?

从原始文件启用共享的问题在于它很危险;您可能会无意中泄漏对象

如果从_raw调用
shared_
而不授予指向
shared _ptr
实例的原始指针的所有权,则
enable _shared _from _raw
基类将保留对自身的强引用,直到您这样做

只要它拥有对自身的强引用,在手动删除对象之前,引用计数将无法达到0,这将完全消除使用
共享\u ptr
的所有好处。一旦某个对象取得了原始指针的所有权,它就会将其强引用降级为弱引用,一切正常

class object : boost::enable_shared_from_raw { }

// Leak! When shared_from_raw is called, raw takes ownership of itself.
object* raw = new object;
boost::shared_ptr<object> bar = boost::shared_from_raw(raw);

// This is fine; bar already owns the object when shared_from_raw is invoked.
object* raw = new object;
boost::shared_ptr<object> bar(raw);
boost::shared_ptr<object> foo = boost::shared_from_raw(raw);

// Also fine; ownership is transferred to bar.
object* raw = new object;
boost::shared_ptr<object> foo = boost::shared_from_raw(raw);
boost::shared_ptr<object> bar(raw);

// Still a leak! Nothing external has taken ownership of the raw pointer.
object* raw = new object;
boost::shared_ptr<object> bar = boost::shared_from_raw(raw);
boost::shared_ptr<object> foo = bar;

enable\u shared\u from\u此
设置了额外的限制,以防止此类泄漏。

虽然它没有真正解释为什么它如此未记录(这可能很难解释:),但我接受它,因为它很好地概括了限制。
// This use case results in a leak.
// Nothing external takes ownership of the raw pointer.
struct Object;
struct ObjectManager
{
    void RegisterObject(boost::shared_ptr<Object> obj)
    {
        m_objects.push_back(obj);
    }
    std::list<boost::shared_ptr<Object> > m_objects;
};
static ObjectManager gObjectManager;

struct Object : boost::enable_shared_from_raw
{
    Object() 
    { 
        gObjectManager.RegisterObject(boost::shared_from_raw(this)); 
    }
}