我已经阅读了一些有关类似问题的答案,但是我仍然对何时使用智能指针的好时机感到困惑。我有一个看起来像这样的类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:
在您提到的情况下,我会使用智能指针。
- 目前复制您的班级不是安全的
- 您不知道您在引用该列表中引用的对象是否仍然存在
- 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
并不是要占有Bar
和Baz
对象的所有权,并且不应删除它们。
如果您的意图是有时可能是对对象的所有权,有时不拿所有权,我建议您考虑一种替代设计,您可以选择一个功能并坚持使用(: