【发布时间】:2017-09-20 00:20:10
【问题描述】:
我已经阅读了几个关于类似问题的答案,但我仍然对何时是使用智能指针的好时机感到困惑。我有一个类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 是个好主意吗?
在这种情况下指针?请说明你的意见。如果您对如何执行此操作有更好的想法,请随时分享。
【问题讨论】:
-
智能指针都是关于所有权的。这个问题归结为您是否希望
Foo拥有它指向的对象。如果不是,那么您的代码很好,Foo的用户需要管理对象的生命周期。如果他们泄漏,就这样吧,不是Foo的错。但是,如果您希望Foo拥有所有权,则将myBar更改为std::unique_ptr<Bar>或std::shared_ptr<Bar>,并将myBaz更改为std::vector<std::unique_ptr<Baz>>或std::vector<std::shared_ptr<Baz>>。那么就不会再有谁拥有什么的问题了。 -
是的,这是
std::unique_ptrs 有用的标准情况之一。 -
@RemyLebeau 在哪种情况下我可以不关心我的课程可能会产生内存泄漏的事实?在我看来,原始指针数据成员总是会导致这种问题。我错了吗?
-
@BobMorane 再次,这是所有权问题。
Foo不分配对象。如果它不获取所给对象的所有权,则它没有使用指向它们的智能指针的业务(或者,至少它可以通过std::shared_ptr使用共享所有权)。您已经说明了需要原始指针的上下文 - “没有进行动态分配” -
旁注:
Foo() = delete;在这里是多余的。
标签: c++11 smart-pointers