循环数据依赖析构函数

Hao*_*ang 5 c++ oop graph c++11

我现在正在设计我自己的带有邻接列表的图形类.除了析构函数之外,我完成了大部分步骤.

这是我的Vertex类:

struct Vertex{
public:
    Vertex(){m_name="";}
    Vertex(string name):m_name(name){}
    ~Vertex(){
        cout << "vertex des" << endl;
        for(int i = 0; i < m_edge.size(); i++){
            delete m_edge[i];
            m_edge[i] = nullptr;
        }
    }
    string m_name;
    vector<Edge*> m_edge;
};
Run Code Online (Sandbox Code Playgroud)

这是我的Edge类:

struct Edge{
public:
    Edge() : m_head(nullptr), m_tail(nullptr) {m_name="";}
    Edge(string name) : m_name(name), m_head(nullptr), m_tail(nullptr) {}

    ~Edge(){
        cout << "Edge des" << endl;

        delete m_head;
        m_head = nullptr;
        delete m_tail;
        m_tail = nullptr;
    }

   string m_name;

   Vertex* m_head;
   Vertex* m_tail;
};
Run Code Online (Sandbox Code Playgroud)

但是,我注意到在调用析构函数时,两个类实际上都调用了彼此的析构函数,因此这给了我一个无限循环.这个设计有问题吗?如果没有,有没有办法解决这个析构函数问题?谢谢!

eer*_*ika 4

但是,我注意到当调用析构函数时,两个类实际上都调用彼此的析构函数,因此这给了我一个无限循环。这样的设计有问题吗?

你现在的设计确实有问题。动态分配只能由其各自所有者删除。通常,所有者是对象的创建者,并且通常只有一个所有者。如果有多个对象,则所有权是共享的。共享所有权需要一种机制(例如引用计数)来跟踪当前所有者的数量。

从析构函数来看,您的顶点似乎由多个边“拥有”,并且这些边似乎由多个顶点拥有。如果不是这样,那么你的图表就会很无聊。但您尚未实施任何形式的所有权跟踪。

我建议使用更简单的设计,其中边不拥有顶点,顶点也不拥有边。它们都应该由一个可能称为 的父对象拥有Graph