gpt4 book ai didi

c++ - 删除由两个 shared_pointer 实例管理的对象

转载 作者:搜寻专家 更新时间:2023-10-31 02:17:20 26 4
gpt4 key购买 nike

我有一个由 NodeEdge 类表示的有向图模型。每个 Node 对象都包含指向其所有传出和传入边的指针,每个 Edge 对象都包含指向其起点和终点(Node 对象)的指针。

class Model
{
public:
~Model()
{
for(Node *node : nodes)
delete node;
}

QVector<Node*> nodes;
};

class Node
{
public:
~Node
{
for(Edge *edge : from)
{
if(edge)
{
edge->to->to.replace(edge, nullptr);
delete edge;
}
}

for(Edge *edge : to)
{
if(edge)
{
edge->from->from.replace(edge, nullptr);
delete edge;
}
}
}

QVector<Edge*> from;
QVector<Edge*> to;
};

class Edge
{
public:
Node *from;
Node *to;
};

到目前为止,我已经使用这样的原始指针实现了它。它相当复杂,涉及在删除节点时手动从边的另一侧(对于每条边)移除指针。我宁愿使用智能指针来使它更安全、更干净。

然而,我需要为两侧删除边缘(并使另一侧的指针无效)这一事实使其成为问题。如果我使用共享指针,边缘将永远不会被删除(即使另一侧消失,剩余的引用也会保持有效)。如果我使用弱指针,我又需要将共享指针存储在其他地方,这将再次变得更加复杂,因为我需要查找它并在任何一方被删除时摆脱它。

我需要的是一个“智能”指针,它将跟踪指针(如共享指针),但在其内部计数器下降到 1(而不是 0)时删除其指针,以便它自身失效(如弱指针)不超出范围。

我应该自己写还是有其他解决方案?

最佳答案

节点

每条边至少被两个节点引用。如果没有节点引用一条边,则这条边是无用的,可以删除。这表明从节点到边缘的指针应该是 shared_ptr<Edge> .

Model中的指针 vector 应该是shared_ptr<Node>

边缘

只有当源节点和目的节点存在时,边才能存在,但节点可以在没有边的情况下存在。这表明指向节点的边中的指针应该是 weak_ptr<Node> from, to ;

你总是可以检查 fromto使用 from.expired() 删除了节点.但是你没有办法绕过移除边缘的正确方法:从两侧移除它的指针,在这种情况下,当不再需要边缘时会触发边缘的破坏。

关于c++ - 删除由两个 shared_pointer 实例管理的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35880154/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com