首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除由两个shared_pointer实例管理的删除对象

删除由两个shared_pointer实例管理的删除对象
EN

Stack Overflow用户
提问于 2016-03-08 23:32:28
回答 2查看 117关注 0票数 2

我有一个由NodeEdge类表示的有向图模型。每个Node对象保存指向其所有传出和传入边缘的指针,每个Edge对象保存指向其源和结束的指针(Node对象)。

代码语言:javascript
运行
复制
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)时删除它的切入点,这样它就在不超出范围的情况下使自己失效(就像弱指针)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-08 23:59:46

节点

每个边至少由两个节点引用。如果没有节点引用边缘,则此边缘是无用的,可以删除。这意味着从节点到边缘的指针应该是shared_ptr<Edge>

顺便说一下,模型中的指针向量应该是shared_ptr<Node>

只有当源节点和目标节点存在时,边缘才能存在,但节点可以不存在边缘。这意味着边到节点的指针应该是weak_ptr<Node> from, to

您可以始终检查fromto节点是否与from.expired()一起删除。但是你无法绕过正确的方法来移除边缘:从两边移除它的指针,在这种情况下,在不再需要的时候会触发对边缘的破坏。

票数 1
EN

Stack Overflow用户

发布于 2016-03-08 23:59:14

如果删除了Node实例,那么您想要做的就是使指向该实例的所有指针失效。这意味着你想要一个自我拥有的概念。因此,指向Node的所有指针都应该是指向由Model (或者Node本身)管理的共享指针的弱指针。

每个Node只能具有指向相邻节点的弱指针。可以根据需要按需创建Edge,而Edge也只能由弱指针组成。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35880154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档