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

C++11 我应该在这里使用智能指针吗?,c++11,smart-pointers,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:

我已经阅读了一些关于类似问题的答案,但我仍然不清楚什么时候是使用智能指针的好时机。我有一个类
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;
};
类条;
Baz类;
福班
{
公众:
Foo(Bar*param1,std::vector和param2);
虚拟~Foo();
//方法使用myBar和myBaz多态性。。。
私人:
酒吧*我的酒吧;
std::载体myBaz;
};
我需要两个数据成员作为多态性的指针。这是一部分 我担心的是有人会写:

int main()
{
    //...

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

    Foo(new Bar(), allOnHeap);

    // ...
}
intmain()
{
//...
std::vector allOnHeap{new Baz(),new Baz()};
Foo(新条(),allOnHeap);
// ...
}
这是合法的,但会导致内存泄漏。我可以在中添加
delete
s 析构函数,但是如果没有动态分配呢 …制造的在你看来,使用smart是个好主意吗
这种情况下的指针?请解释你的意见。如果您对如何做到这一点有更好的想法,请随时分享。

在这种情况下,智能指针不会立即出现在脑海中,主要是因为不清楚所有权要求是什么。如果您遵循的是C++核心指南建议,那么很明显,<代码>类FoO < /C>不打算拥有<代码> Bar <代码>和<代码> Baz < /Cord>对象,不应该删除它们。 如果您的目的可能是有时获得对象的所有权,有时不获得所有权,我建议您考虑另一种设计,在这种设计中,您可以选择单一功能并坚持使用它(:

我已经读过一些关于类似问题的答案,但我仍然感到困惑 困惑于何时是使用智能指针的好时机。我有一个 类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;
};
在你提到的情况下,我会使用智能指针

  • 目前,复制您的类是不安全的
  • 您无法知道列表中正在引用的对象在引用时是否仍然存在
  • RAII不会自动用于 我的酒吧
  • 更具体地说,可以IMHO建模您需要的所有权语义:

    使用
    unique\u ptr
    std::vector

    • unique\u ptr
      可在保留类作用域的末尾进行自动清理

    • std::vector
      :每个弱ptr表示使用类(通过弱ptr访问的类)没有所有权语义,在使用之前必须尝试获得临时所有权(通过锁定提供共享ptr)

    通过上述智能指针的使用,当错误地从盒子中复制时,会出现编译器错误(因为unique_ptr不可复制),更重要的是,列表中的每个项目都可以安全访问。holding类的实例化器也清楚地知道类编写器所设想的所有权语义


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

    智能指针都与所有权有关。这个问题归结为您是否希望
    Foo
    拥有它所指向的对象。如果不想,那么您的代码就可以了,
    Foo
    的用户需要管理对象的生命周期。如果它们泄漏,就这样吧,不是
    Foo
    的错。但是,如果你想
    Foo
    拥有所有权,那么将
    myBar
    更改为
    std::unique\u ptr
    std::shared\u ptr
    ,并将
    myBaz
    更改为
    std::vector
    std::vector
    。那么谁拥有什么就没有任何问题了。是的,这是标准之一标准情况下,
    std::unique_ptr
    s是有用的。@RemyLebeau在哪种情况下,我可以不关心我的类可能会产生内存泄漏的事实?在我看来,原始指针数据成员总是会导致这种问题。我错了吗?@BobMorane再次强调,这是所有权的问题。
    Foo
    不分配e对象。如果它没有获得给定对象的所有权,它就没有必要使用指向它们的智能指针(或者,至少,它可以通过
    std::shared_ptr
    )使用共享所有权。您已经说明了一个需要原始指针的上下文-“没有进行动态分配”旁注:
    Foo()=delete;
    在这里是多余的。也许智能指针应该总是跳转到脑海中来定义所有权语义应该是什么。