在使用 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 时才值得为儿童使用智能指针吗?