n 元树结构的析构函数

Destructor of an n-ary tree struct

我有以下代码:

const int MAXCHILD = 10;

struct Node {
    Node *child[10];

    Node();
    void deleteNode(Node *n);
    ~Node();
};

Node::Node() {
    for(int i=0; i<MAXCHILD; i++) {
        child[i] = NULL;
    }
}

void Node::deleteNode(Node *n) {
    if(n == NULL) {
        return;
    } else {
        for(int i=0; i<MAXCHILD; i++) {
            deleteNode(n->child[i]);
        }

        for(int i=0; i<MAXCHILD; i++) {
            n->child[i] = NULL;
        }
    }

    n = NULL;
}

Node::~Node() {
    Node *n = this;
    deleteNode(n);
}

int main() {
    Node *n = new Node();

    ...

    delete n;
    n = NULL;

    return 0;
}

这是我试过的。
compiling/testing 期间我没有遇到任何严重错误,但是当我使用 Valgrind 测试内存泄漏时,它表明我一直在发生内存泄漏。

我知道我的析构函数中有很多缺陷;会有什么问题?
提前致谢!

内存泄漏是由于您从未解除分配子项造成的。
(将指针设置为 NULL 是不够的。)

您的析构函数可以像这样简单:

Node::~Node() {
    for(int i=0; i<MAXCHILD; i++) {
        delete child[i];
        child[i] = nullptr;
    }
}

内存泄漏的另一个原因也可能是子节点的递归生成或构造。如果您更改结构内部的子数据字段并以不同的方式管理它会更好,例如以某种方式在构造函数内部携带它或在外部链接子项和父项。尝试它可能会让你摆脱内存泄漏