C++:访问 shared_ptr 的容器应该返回原始还是共享 ptr?

标签 c++ containers shared-ptr ownership

如果我使用一个 shared_ptrs 容器并明确允许访问它的元素,如果我想让容器负责“清理”,我应该返回 shared_ptrs 还是原始指针?

class Container
{
private:
    std:vector<shared_ptr<Foo> > foo_ptrs;

public:
    shared_ptr<Foo> operator[](std::size_t index) const {}; // or
    Foo* operator[](std::size_t index) const {};
};

在这种情况下是否有返回 shared_ptrs 的原因,或者原始指针是否可以?

您好!

最佳答案

返回引用

只返回一个shared_ptr如果您想让访问者共享生命周期管理。这是一个有效的设计,但正如你所说 Container全权负责清理工作。 shared_ptr只是 Containter 的一个实现细节,事实上有一个 vectorshared_ptr用于实现容器的 s 不应通过接口(interface)公开。

除非获得 NULL 有意义,否则不要返回指针来自 Container .通常它不会。用户想要的只是访问容器的第 i-th 个元素,引用可以完美地做到这一点。

你真正想要的是 std::vector<std::unique_ptr<Foo>> . Container是管理内存的人,并在成员声明中这样说。其他人无权知道实现情况。

看看Boost.Pointainers如果您不愿意或不能使用 C++0x。

关于C++:访问 shared_ptr 的容器应该返回原始还是共享 ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3885580/

相关文章:

c++ - 创建一个非拥有的 shared_ptr?

c++ - 通过类析构函数中重置成员shared_ptrs解决C++11shared_ptr循环引用?

c++ - 将函数返回的共享指针绑定(bind)到对 const 的左值引用是好的做法吗?

c++ - 使用 std::invoke 调用模板函数

c++ - 部分匹配 std::map 的键

flutter - 填充堆栈中所有可用的水平空间

jboss - Kubernetes 自动缩放容器

c++ - GetSystemMetrics 为我的屏幕返回错误的值

C++ 从指针 vector 中删除元素

c++ - 与派生类的虚指针混淆