gpt4 book ai didi

c++ - 为什么 boost::enable_shared_from_raw 如此没有记录?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:24:19 26 4
gpt4 key购买 nike

boost smart_ptr 库包含两种使类能够为自身提供 shared_ptr 的方式,enable_shared_from_this(也可用于 STL 的智能指针)和 enable_shared_from_raw。对我来说,后者似乎更优越,因为它允许在构造函数中创建共享指针。然而,这个类根本没有在文档中提到,不是根 boost/ header 的一部分,并且谷歌搜索它主要在实际的 .hpp 文件中给出命中。

boost::enable_shared_from_raw 是否已弃用或以其他方式不适合使用?我错过了什么吗?

最佳答案

enable_shared_from_raw 的问题在于它很危险;您可能会不经意地导致对象泄漏。

如果您调用 shared_from_raw 而未将原始指针的所有权授予 shared_ptr 的实例,则 enable_shared_from_raw 基类将 保持对自身的强引用,直到您这样做。

只要它持有对自身的强引用,引用计数就不会达到 0,直到对象被手动删除,这完全消除了使用 shared_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;

我认为您想要在构造函数中调用 shared_from_this() 的最常见情况是您想要向某种管理器注册对象;这很可能会导致此处描述的泄漏。

// 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));
}
}

enable_shared_from_this 设置了额外的限制以防止此类泄漏。

关于c++ - 为什么 boost::enable_shared_from_raw 如此没有记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22184772/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com