独特的指针所有权

时间:2014-07-03 14:33:56

标签: c++ pointers unique-ptr

我很难理解唯一指针的所有权。 任何人都可以解释如何存储指向集合中唯一指针的指针吗?

来自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的含义吗?因为可以从集合中访问实际对象并进行修改。

2 个答案:

答案 0 :(得分:2)

  

这是否不违反unique_ptr的含义?

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

答案 1 :(得分:0)

唯一的ptr只能通过引用访问。因此,两种情况下的ownerip永远不会更改容器是ptr的所有者。

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

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