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

Should I use smart pointers here?

我已经阅读了几个关于类似问题的答案,但我仍然不清楚什么时候是使用智能指针的好时机。我有一个 class 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);

    // ...
}

这将是合法的,但会导致内存泄漏。我可以添加 deletes 析构函数,但是如果没有动态分配怎么办 制成?在您看来,使用 smart 是个好主意吗? 在这种情况下的指针?请说明您的意见。如果您对此有更好的想法,请随时分享。

在这种情况下不会立即想到智能指针,主要是因为不清楚所有权要求是什么。如果您遵循关于 ownership transfer and raw pointers 的 C++ 核心指南建议,那么很明显 class Foo 无意取得 BarBaz 对象的所有权,并且不应删除它们.

如果您的意图是有时获取对象的所有权,有时不获取对象的所有权,我建议您考虑另一种设计,您可以选择一个功能并坚持使用它 (:

I have read several answers about similar issues, but I am still confused as to when it is a good time to use smart pointers. I have a class Foo which looks like this:

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

  1. 目前复制您的 class 不安全
  2. 您无法知道您在列表中引用的对象在引用它时是否仍然存在
  3. RAII 不会自动用于 我的栏

更具体地说,恕我直言,可以对您需要的所有权语义进行建模:

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

  • unique_ptr<Bar> 在持有 class 的范围

  • 结束时为您提供自动清理
  • std::vector<weak_ptr<Baz>>:每个 weak_ptr 表示使用 class(class 将通过 weak_ptr) 没有所有权语义,并且在使用之前必须尝试获得临时所有权(通过锁定给一个 shared_ptr)。

使用上面提到的智能指针的用法,当你错误地复制出盒子时会得到一个编译器错误(因为unique_ptr是不可复制的),更重要的是,列表中的每一项都会安全访问。控股 class 的实例化者也对 class 作者

设想的所有权语义有清晰的认识

顺便说一句,您不必显式删除默认构造函数。 See 了解详情。