3

如果我使用 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,或者原始指针可以吗?

问候!

4

3 回答 3

2

shared_ptr如果您想继续使用该对象而不担心容器元素被删除, 您应该返回 a 。

否则,在其他容器用户清理容器或擦除引用的元素之后,您可能会得到一个孤立的原始指针。

于 2010-10-07T20:25:35.757 回答
2

返回参考

shared_ptr如果您打算让访问者共享生命周期管理,则仅返回 a 。这是一个有效的设计,但正如你所说Container,它完全负责清理工作。 shared_ptr只是一个实现细节,有一个用于实现容器的Containter事实不应该通过接口暴露出来。vectorshared_ptr

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

你真正想要的是一个std::vector<std::unique_ptr<Foo>>. Container是管理内存的人,并在成员声明中这么说。其他人都不知道执行情况。

如果您不愿意或无法使用 C++0x,请查看Boost.Pointainers 。

于 2010-10-07T20:31:14.343 回答
2

在这种情况下,您可能“应该”返回的是 boost::weak_ptr<>,它为您提供了您所描述的语义(容器保持所有权,在给出外部引用后仍然可以删除对象,并且您可以安全地发现对象在外部使用时是否仍然有效)。当然这需要使用 boost::shared_ptr<> 我认为,所以它可能不适用于您的情况。

希望对您有所帮助,即使它可能不适合您使用。

于 2010-10-07T20:35:58.313 回答