我已经阅读了几个关于类似问题的答案,但我仍然对何时是使用智能指针的好时机感到困惑。我有一个类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
析构函数,但是如果没有动态分配则会怎样
制作?在您看来,使用智能是一个好主意
在这种情况下的指针?请解释一下你的意见。如果您对如何做到这一点有更好的想法,请随时分享。
答案 0 :(得分:1)
在这种情况下,智能指针不会立即浮现在脑海中,主要是因为它不清楚所有权要求是什么。如果您遵循ownership transfer and raw pointers上的C ++核心指南建议,则明确class Foo
并非旨在取得Bar
和Baz
个对象的所有权,不要删除它们。
如果您的意图有时可能取得对象的所有权,有时候不会取得所有权,我建议考虑一种替代设计,您可以选择一种功能并坚持下去(:
答案 1 :(得分:1)
我已经阅读了几个关于类似问题的答案,但我仍然是 困惑于何时是使用智能指针的好时机。我有一个 类Foo看起来像这样:
在你提到的情况下,我会使用智能指针。
更具体地说,人们可以模拟您需要的所有权语义:
使用unique_ptr<Bar>
并使用std::vector<weak_ptr<Baz>>
。
unique_ptr<Bar>
在持有类的范围结束时为您提供自动清理
std::vector<weak_ptr<Baz>>
:每个weak_ptr指示using类(将通过weak_ptr访问的类)没有所有权语义,并且在使用之前必须尝试获得临时所有权(通过锁定哪个给一个shared_ptr)。
通过上面提到的智能指针的使用,当错误地复制时会出现编译器错误(因为unique_ptr不可复制),更重要的是,列表中的每个项目都可以安全访问。持有类的实例化者也清楚地了解了类作者所设想的所有权语义
顺便说一下,您不必明确删除默认构造函数。 See了解详情。