智能指针概念所有权和寿命
Smart pointer concepts ownership and lifetime
在使用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的情况下,才值得为孩子们使用智能指针吗?
您可以返回一个const std::unique_ptr<Object>&
,这将允许您具有与原始指针相同的语义来调用它上的方法,同时防止删除。
当您知道所有权将保留在任何原始指针上,并且您确信人们不会直接尝试delete
指针时,将std::unique_ptr
与原始指针一起使用是有意义的。这与使用std::weak_ptr
和std::shared_ptr
不同,因为它们根本不允许您使用悬挂指针。
总有犯错的空间,所以答案真的取决于具体情况,这个代码将在哪里使用等等。
相关文章:
- 智能指针概念所有权和寿命
- 如何指示指针C++所有权
- 如何将所有权从一个共享指针向量转移到另一个向量?
- C++类指针和所有权
- 什么是资源或指针的所有权?
- 进入智能指针,如何处理代表所有权
- 将智能指针所有权转移到容器
- 将原始指针的所有权转移到unique_ptr
- 明智的指针所有权语义和平等
- EIGEN地图 - 它是否占数据指针的所有权
- 带有原子变量的指针所有权
- 如果指针已经被删除,指针容器怎么能拥有指针的所有权
- 是否使用unique_ptr作为所有权和原始指针
- 文件输入和指针所有权语义
- 指针所有权
- 我的自动指针即使在所有权转让后也能正常工作
- 如何证明您传递了指针的所有权
- C++:在共享所有权的情况下,C++11移动语义可以避免指针吗
- Objective-C ARC 指针所有权与C++
- 指向没有所有权的堆栈对象的指针