【发布时间】:2020-06-03 01:46:59
【问题描述】:
在使用 C++ 智能指针(唯一、共享、弱)时,有两个重要的概念(所有权、生命周期)。我试图理解这些概念以及它们如何影响智能指针(或原始指针)的使用。
我看了两条规则:
- 始终使用智能指针来管理动态的所有权/生命周期 对象。
- 在不管理所有权/生命周期时不要使用智能指针。
一个例子:
class Object
{
public:
Object* child(int i) { return mChildren[i]; }
// More search and access functions returning pointers here
private:
vector<Object*> mChildren;
};
我想用智能指针重写它。让我们先忽略 child()。轻松的游戏。父母拥有自己的孩子。所以让 mChildren 成为 unique_ptr 的向量。
根据上述规则,有些人认为 child(i) 应该继续返回原始指针。
但这不是有风险吗?有人可能会做一些愚蠢的事情,比如删除返回的对象会导致难以调试的崩溃……这可以通过使用 weak_ptr 或 shared_ptr 作为返回值来避免。
难道不能说复制指针总是意味着暂时共享所有权和/或断言对象的生命周期吗?
只有在我没有获得更安全的 API 的情况下才值得为儿童使用智能指针吗?
【问题讨论】:
标签: c++ pointers smart-pointers object-lifetime ownership-semantics