c++ - 如何将 shared_ptr 传递给生命周期较短的类?

标签 c++ c++11 shared-ptr smart-pointers

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

最佳答案

在这种情况下,当您知道共享资源的生命周期将比您将指针传递给正确的那些生命周期更长时,要做的是传递一个引用原始指针:

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

// ...

std::shared_ptr<object> sp;

// ...

func(sp.get()); // pass raw 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.

关于c++ - 如何将 shared_ptr 传递给生命周期较短的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35543520/

相关文章:

c++ - 独立程序的多对一双向通信

c++ - std::unordered_map 中的 buckets 接口(interface)有什么用?

c++ - 可变模板函数

c++ - 这个 std::vector 和 std::shared_ptr 内存泄漏是一个错误吗?

dll - 在 DLL 接口(interface)中使用 boost::shared ptr 可以吗?

c++ - 编译器可以将对常量参数的引用优化为常量值吗?

c++ - 生成所有排列集

c++ - 写入文件无法显示所有内容

C++11 似乎不可能通过 shared_ptr 访问 protected 成员

c++ - 包裹在共享指针中时的 vector 构造