gpt4 book ai didi

c++ - 何时使用 shared_ptr 以及何时使用原始指针?

转载 作者:IT老高 更新时间:2023-10-28 12:08:35 38 4
gpt4 key购买 nike

class B;

class A
{
public:
A ()
: m_b(new B())
{
}

shared_ptr<B> GimmeB ()
{
return m_b;
}

private:
shared_ptr<B> m_b;
};

假设 B 是一个在语义上不应该存在于 A 生命周期之外的类,即 B 本身存在绝对没有意义。 GimmeB返回 shared_ptr<B>B* ?

一般来说,完全避免在 C++ 代码中使用原始指针代替智能指针是一种好习惯吗?

我认为 shared_ptr仅应在明确转让或共享所有权时使用,我认为在函数分配一些内存、用一些数据填充它并返回它并且调用者和被调用者之间存在理解的情况之外,这是非常罕见的前者现在对这些数据“负责”。

最佳答案

我认为你的分析很正确。在这种情况下,如果保证对象永远不会为空,我也会返回一个裸 B*,甚至返回一个 [const] B&

在仔细阅读智能指针之后,我得出了一些指导方针,这些指导方针告诉我在许多情况下应该做什么:

  • 如果您返回一个其生命周期将由调用者管理的对象,则返回 std::unique_ptr。如果需要,调用者可以将其分配给 std::shared_ptr
  • 返回 std::shared_ptr 实际上很少见,当它有意义时,通常很明显:您向调用者表明它将延长指向对象的生命周期超出最初维护资源的对象的生命周期。从工厂返回共享指针也不异常(exception):您必须这样做,例如。当你使用 std::enable_shared_from_this
  • 您很少需要 std::weak_ptr,除非您想了解 lock 方法。这有一些用途,但很少见。在您的示例中,如果从调用者的角度来看,A 对象的生命周期不是确定性的,则需要考虑这一点。
  • 如果您返回对调用者无法控制其生命周期的现有对象的引用,则返回裸指针或引用。通过这样做,你告诉调用者一个对象存在并且她不必关心它的生命周期。如果你不使用 nullptr 值,你应该返回一个引用。

关于c++ - 何时使用 shared_ptr 以及何时使用原始指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7657718/

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