唯一的指针所有权

Unique pointer ownership

本文关键字:所有权 指针 唯一      更新时间:2023-10-16

我很难理解唯一指针的所有权。有谁能解释一下如何在集合中存储一个指向唯一指针的指针?

来自SFML游戏开发手册的例子,说明了这个问题:

typedef std::pair<SceneNode*, SceneNode*> Pair;
typedef std::unique_ptr<SceneNode> Ptr;
std::vector<Ptr> mChildren;
void SceneNode::checkSceneCollision(SceneNode& sceneGraph, std::set<Pair>& collisionPairs)
{
    checkNodeCollision(sceneGraph, collisionPairs);
    for(Ptr& child : sceneGraph.mChildren)
        checkSceneCollision(*child, collisionPairs);
}
void SceneNode::checkNodeCollision(SceneNode& node, std::set<Pair>& collisionPairs)
{
    if (this != &node && collision(*this, node))
        collisionPairs.insert(std::minmax(this, &node));
    for(Ptr& child : mChildren)
        child->checkNodeCollision(node, collisionPairs);
}

这不是违背了unique_ptr的含义吗?因为可以从集合中访问实际对象并修改它

这不是违背了unique_ptr的含义吗?

。正如您所说的,unique_ptr指定了所有权语义,而没有其他含义。特别是,它指定指针只有一个所有者,但它没有说明访问的任何内容。可以有任意多个访问器

唯一的ptr只能通过引用来访问。因此,这两种情况下的所有权都不会改变——容器是ptr的所有者。

 for(Ptr& child : mChildren)
        child->checkNodeCollision(node, collisionPairs);

在这种情况下,为每个包含的指针创建一个引用,该引用从不调用move或copy语义,因此不参与所有权。