我应该在这里使用智能指针吗?

时间:2017-09-20 00:20:11

标签: c++11 smart-pointers

我已经阅读了几个关于类似问题的答案,但我仍然对何时是使用智能指针的好时机感到困惑。我有一个类Foo,如下所示:

class Bar;
class Baz;

class Foo
{
public:
    Foo(Bar* param1, std::vector<Baz*>& param2);

    virtual ~Foo();

    // Method using myBar and myBaz polymorphically...

private:
    Bar*               myBar;
    std::vector<Baz*>  myBaz;
};

我需要两个数据成员作为多态的指针。这是一部分 一个API和我担心的是有人写道:

int main()
{
    //...

    std::vector<Baz*> allOnHeap {new Baz(), new Baz()};

    Foo(new Bar(), allOnHeap);

    // ...
}

这将是合法的,但会导致内存泄漏。我可以添加delete 析构函数,但是如果没有动态分配则会怎样 制作?在您看来,使用智能是一个好主意 在这种情况下的指针?请解释一下你的意见。如果您对如何做到这一点有更好的想法,请随时分享。

2 个答案:

答案 0 :(得分:1)

在这种情况下,智能指针不会立即浮现在脑海中,主要是因为它不清楚所有权要求是什么。如果您遵循ownership transfer and raw pointers上的C ++核心指南建议,则明确class Foo并非旨在取得BarBaz个对象的所有权,不要删除它们。

如果您的意图有时可能取得对象的所有权,有时候不会取得所有权,我建议考虑一种替代设计,您可以选择一种功能并坚持下去(:

答案 1 :(得分:1)

  

我已经阅读了几个关于类似问题的答案,但我仍然是   困惑于何时是使用智能指针的好时机。我有一个   类Foo看起来像这样:

在你提到的情况下,我会使用智能指针。

  1. 目前复制班级并不安全
  2. 您无法知道您在列表中引用的对象在引用时是否仍然存在
  3. RAII不会自动用于 myBar
  4. 更具体地说,人们可以模拟您需要的所有权语义:

    使用unique_ptr<Bar>并使用std::vector<weak_ptr<Baz>>

    • unique_ptr<Bar>在持有类的范围结束时为您提供自动清理

    • std::vector<weak_ptr<Baz>>:每个weak_ptr指示using类(将通过weak_ptr访问的类)没有所有权语义,并且在使用之前必须尝试获得临时所有权(通过锁定哪个给一个shared_ptr)。

    通过上面提到的智能指针的使用,当错误地复制时会出现编译器错误(因为unique_ptr不可复制),更重要的是,列表中的每个项目都可以安全访问。持有类的实例化者也清楚地了解了类作者所设想的所有权语义

    顺便说一下,您不必明确删除默认构造函数。 See了解详情。