我应该在这里使用智能指针吗?
Should I use smart pointers here?
我已经阅读了几个关于类似问题的答案,但我仍然不清楚什么时候是使用智能指针的好时机。我有一个 class 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 是个好主意吗?
在这种情况下的指针?请说明您的意见。如果您对此有更好的想法,请随时分享。
在这种情况下不会立即想到智能指针,主要是因为不清楚所有权要求是什么。如果您遵循关于 ownership transfer and raw pointers 的 C++ 核心指南建议,那么很明显 class Foo
无意取得 Bar
和 Baz
对象的所有权,并且不应删除它们.
如果您的意图是有时获取对象的所有权,有时不获取对象的所有权,我建议您考虑另一种设计,您可以选择一个功能并坚持使用它 (:
I have read several answers about similar issues, but I am still
confused as to when it is a good time to use smart pointers. I have a
class Foo which looks like this:
我会在你提到的情况下使用智能指针。
- 目前复制您的 class 不安全
- 您无法知道您在列表中引用的对象在引用它时是否仍然存在
- RAII 不会自动用于
我的栏
更具体地说,恕我直言,可以对您需要的所有权语义进行建模:
使用unique_ptr<Bar>
并使用std::vector<weak_ptr<Baz>>
。
unique_ptr<Bar>
在持有 class 的范围
结束时为您提供自动清理
std::vector<weak_ptr<Baz>>
:每个 weak_ptr 表示使用 class(class 将通过 weak_ptr) 没有所有权语义,并且在使用之前必须尝试获得临时所有权(通过锁定给一个 shared_ptr)。
使用上面提到的智能指针的用法,当你错误地复制出盒子时会得到一个编译器错误(因为unique_ptr是不可复制的),更重要的是,列表中的每一项都会安全访问。控股 class 的实例化者也对 class 作者
设想的所有权语义有清晰的认识
顺便说一句,您不必显式删除默认构造函数。 See 了解详情。
我已经阅读了几个关于类似问题的答案,但我仍然不清楚什么时候是使用智能指针的好时机。我有一个 class 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 是个好主意吗?
在这种情况下的指针?请说明您的意见。如果您对此有更好的想法,请随时分享。
在这种情况下不会立即想到智能指针,主要是因为不清楚所有权要求是什么。如果您遵循关于 ownership transfer and raw pointers 的 C++ 核心指南建议,那么很明显 class Foo
无意取得 Bar
和 Baz
对象的所有权,并且不应删除它们.
如果您的意图是有时获取对象的所有权,有时不获取对象的所有权,我建议您考虑另一种设计,您可以选择一个功能并坚持使用它 (:
I have read several answers about similar issues, but I am still confused as to when it is a good time to use smart pointers. I have a class Foo which looks like this:
我会在你提到的情况下使用智能指针。
- 目前复制您的 class 不安全
- 您无法知道您在列表中引用的对象在引用它时是否仍然存在
- RAII 不会自动用于 我的栏
更具体地说,恕我直言,可以对您需要的所有权语义进行建模:
使用unique_ptr<Bar>
并使用std::vector<weak_ptr<Baz>>
。
unique_ptr<Bar>
在持有 class 的范围 结束时为您提供自动清理
std::vector<weak_ptr<Baz>>
:每个 weak_ptr 表示使用 class(class 将通过 weak_ptr) 没有所有权语义,并且在使用之前必须尝试获得临时所有权(通过锁定给一个 shared_ptr)。
使用上面提到的智能指针的用法,当你错误地复制出盒子时会得到一个编译器错误(因为unique_ptr是不可复制的),更重要的是,列表中的每一项都会安全访问。控股 class 的实例化者也对 class 作者
设想的所有权语义有清晰的认识顺便说一句,您不必显式删除默认构造函数。 See 了解详情。