【发布时间】:2016-11-12 01:31:57
【问题描述】:
我知道一个班级将永远归std::shared_ptr所有。然而,将shared_ptr 甚至weak_ptr 传递给不需要所有权或生命周期保证的函数和方法会产生不必要的开销。为了解决这个问题,我经常将原始指针传递给函数。类本身继承自std::enable_shared_from_this,因此如果函数需要获取指针的所有权,它可以使用类的方法来获取shared_ptr。
这一切都很好。但是在某些情况下,我真的不想从原始指针创建 shared_ptr,而我想要的是 weak_ptr。
根据我对std::shared_ptr 的通常实现的理解,它有两个用作引用计数器的原子变量;一张给shared_ptr,一张给weak_ptr。
如果我只有一个指向我的类的原始指针并且我想要一个weak_ptr,我必须首先创建一个shared_ptr 并转换它。这样做意味着引用计数器会像这样改变:
- 构造
shared_ptr,增加shared_ptr计数器 - 复制构造
weak_ptr,递增weak_ptr计数器 - 允许
shared_ptr超出范围,递减shared_ptr计数器
这似乎违背了“不用为不用的东西付费”的理念。有没有办法让我的班级只提供weak_ptr 而无需先创建shared_ptr?
【问题讨论】:
-
这更像是您需要
shared_from_this而不是enable_shared_from_this。类似weak_from_this. -
你是对的,我会编辑标题。有一个为 C++17 提议的
weak_from_this,但我正在寻找我现在可以使用的东西。 -
这意味着该类只使用
std::make_shared<T>()创建。它们总是比我传递原始指针的范围更持久。如果原始指针需要存储在它传递到的范围之外,它会被转换回shared_ptr。 -
@Fibbles:“这似乎违背了“你不用为不用的东西付费”的想法。” 从最技术的意义上说,是的.但是,尽管有这句格言,C++ 标准有许多 地方可以让你为不使用的东西付费。而且我不只是在谈论 iostream。在这种情况下,成本非常低(3 个原子计数器更改),可能不值得担心。
-
@Fibbles:其实
shared_ptr本身就是这样一个对象。它在get返回的对象和它管理的对象的生命周期之间存在区别。 Many people never actually use that functionality, 但他们为此付出了代价,因为这就是为什么shared_ptr实现是两个指针的大小。
标签: c++ pointers c++14 shared-ptr weak-ptr