我读过几个关于类似问题的答案,但对于何时才是使用智能指针的好时机,我仍然感到困惑。我有一个类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,但是如果没有动态分配怎么办?在您看来,在这种情况下使用智能指针是个好主意吗?请解释一下你的看法。如果你对如何做到这一点有更好的想法,请随意分享。
发布于 2017-09-20 09:55:47
我读过几个关于类似问题的答案,但对于何时才是使用智能指针的好时机,我仍然感到困惑。我有一种叫Foo的,它看起来像这样:
在你提到的情况下我会用聪明的指针。
更具体地说,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,这是类编写者所设想的所有权语义。
顺便说一句,您不必显式删除默认构造函数。详细信息为看见。
发布于 2017-09-20 00:32:13
在这种情况下,智能指针不会立即出现在脑海中,这主要是因为不清楚所有权要求是什么。如果您正在遵循C++核心指南关于所有权转移和原始指针的建议,那么很明显,class Foo并不打算拥有Bar和Baz对象,不应该删除它们。
如果您的意图是有时拥有对象的所有权,有时不拥有对象,那么我建议您考虑另一种设计,在这种设计中,您可以选择一个单一的功能并坚持它(:
https://stackoverflow.com/questions/46311487
复制相似问题