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



我已经阅读了一些有关类似问题的答案,但是我仍然对何时使用智能指针的好时机感到困惑。我有一个看起来像这样的类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 s破坏者,但是如果没有动态分配的话该怎么办制成?您认为使用Smart是个好主意在这种情况下,指针?请解释您的意见。如果您对如何执行此操作有更好的想法,请随时分享。

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

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

  1. 目前复制您的班级不是安全的
  2. 您不知道您在引用该列表中引用的对象是否仍然存在
  3. raii不会自动用于mybar

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

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

  • unique_ptr<Bar>在举行班的范围结束时自动清理

  • std::vector<weak_ptr<Baz>>:feek_ptr的每一个都表明使用类(可以通过feev_ptr访问的类)没有所有权语义,并且在使用之前必须尝试获得临时所有权(通过锁定,这给一个共享的_ptr锁定)。

使用上述智能指针的用法,当错误地复制框时,您将遇到编译器错误(因为unique_ptr是不可复制的),更重要的是,列表中的每个项目都可以安全访问。控股班的实例化也有一个清晰的想法,班级作家所设想的所有权语义

顺便说一句,您不必明确删除默认构造函数。有关详细信息。

智能指针在这种情况下并没有立即浮现在脑海中,主要是因为目前尚不清楚所有权要求是什么。如果您遵循有关所有权转移和原始指针的C 核心指南,那么很明显,class Foo并不是要占有BarBaz对象的所有权,并且不应删除它们。

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

相关内容

  • 没有找到相关文章

最新更新