如何将 shared_ptr 传递给 class 并缩短生命周期?

How to pass shared_ptr to class with lower lifetime?

我想优化我的代码。我有一个 class 有一个 shared_ptr 数据成员。在这个class的一些方法中,我创建了需要使用这个成员的对象(只是为了从shared_ptr指向的对象中获取信息)。我知道这些创建的对象的生命周期低于我的主要 class。 如何传递这个指针?我认为另一个 shared_ptrs 是不必要的(因为我保证该对象将存在)。那么我创建的 classes 应该得到什么?他们应该得到原始指针吗? Weak_ptr?或者最好的解决方案是获取 shared_ptr (并增加其引用计数器)?什么是最标准的解决方案?

shared_ptr 传递给不存储资源的函数时,通过引用传递它:

void foo(const shared_ptr<T>& ptr)
{
    // Basically just a pointer dereference
    std::cout << ptr->bar() << '\n';
}

int main()
{
   std::shared_ptr<T> ptr{std::make_shared<T>()};
   foo(ptr);
}

这不会增加引用计数,但没关系 - 您实际上是将其视为原始指针(因为您只是暂时检查指针对象),但以一种安全的方式进行处理,因为如果您不小心复制然后您将获得可以挽救您生命的引用计数增量。 :)

但是,如果 foo 需要存储此对象的任何类型的句柄,那么您应该通过复制传入 shared_ptr ……或考虑使用 weak_ptr 以便您在至少得到一些表面上的安全。

上面人为设计的示例非常简单,我实际上将其制作成以下内容:

void foo(const T& ptr)
{
    std::cout << ptr.bar() << '\n';
}

int main()
{
   std::shared_ptr<T> ptr{std::make_shared<T>()};
   foo(*ptr.get());
}

在这种情况下,当您知道共享资源的生命周期将比您将指针传递给正确的生命周期长要做的是传递一个 reference 或一个 raw pointer:

void func(object* o)
{
    // do stuff with o
} 

// ...

std::shared_ptr<object> sp;

// ...

func(sp.get()); // pass raw pointer

这样做的主要原因是,无论哪种智能指针管理资源,该函数都是有用的。通过接受原始指针,您的函数能够接受来自共享指针以及唯一指针的对象和任何其他第三方 smart pointer.

传入智能指针没有任何好处,除非函数需要修改智能指针本身。

可在此处找到由 Bjarne Straustrup 和 Herb Sutter 制定的一套很好的指南:CppCoreGuidelines

关于传递原始指针(或引用)的规则: F.7

Passing a smart pointer transfers or shares ownership and should only be used when ownership semantics are intended. A function that does not manipulate lifetime should take raw pointers or references instead.

Passing by smart pointer restricts the use of a function to callers that use smart pointers. A function that needs a widget should be able to accept any widget object, not just ones whose lifetimes are managed by a particular kind of smart pointer.