首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该在这里使用智能指针吗?

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

Stack Overflow用户
提问于 2017-09-20 00:20:10
回答 2查看 62关注 0票数 2

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

代码语言:javascript
复制
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的一部分,我担心有人会这样写:

代码语言:javascript
复制
int main()
{
    //...

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

    Foo(new Bar(), allOnHeap);

    // ...
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-20 09:55:47

我读过几个关于类似问题的答案,但对于何时才是使用智能指针的好时机,我仍然感到困惑。我有一种叫Foo的,它看起来像这样:

在你提到的情况下我会用聪明的指针。

  1. 目前,复制您的类是不安全的。
  2. 在引用列表时,您无法知道在列表中引用的对象是否仍然存在
  3. RAII不自动用于myBar

更具体地说,IMHO可以对所需的所有权语义进行建模:

使用unique_ptr<Bar>和std::vector<weak_ptr<Baz>>。

  • unique_ptr<Bar>在holding类作用域的末尾为您提供自动清理功能
  • std::vector<weak_ptr<Baz>>:每个which _ptr都表示using类(通过weak_ptr进行访问的类)没有所有权语义,并且在使用之前必须尝试获得临时所有权(通过锁定获得一个shared_ptr)。

通过上述智能指针的使用,当错误地从框中复制时(因为unique_ptr是不可复制的),您将得到一个编译器错误,更重要的是,列表中的每一项都是可以安全访问的。holding类的实例器也有一个清晰的概念wrt,这是类编写者所设想的所有权语义。

顺便说一句,您不必显式删除默认构造函数。详细信息为看见。

票数 1
EN

Stack Overflow用户

发布于 2017-09-20 00:32:13

在这种情况下,智能指针不会立即出现在脑海中,这主要是因为不清楚所有权要求是什么。如果您正在遵循C++核心指南关于所有权转移和原始指针的建议,那么很明显,class Foo并不打算拥有Bar和Baz对象,不应该删除它们。

如果您的意图是有时拥有对象的所有权,有时不拥有对象,那么我建议您考虑另一种设计,在这种设计中,您可以选择一个单一的功能并坚持它(:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46311487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档