【问题标题】:Destructor of an n-ary tree structn 元树结构的析构函数
【发布时间】:2015-07-01 10:50:55
【问题描述】:

我有以下代码:

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;
}

这是我尝试过的。
在编译/测试时我没有遇到任何严重错误,但是当我使用 Valgrind 测试内存泄漏时,它表明我一直在制造内存泄漏。

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

【问题讨论】:

  • 您在deleteNode() 函数中缺少delete n;(不应为this 完成)。
  • 将您的孩子存储在unique_ptrs 中。哦,然后调用 delete 来返回你完成的内存。
  • @πάνταῥεῖ delete n; 会出现在 t = NULL; 之后还是之前?
  • @Yakk 抱歉,unique_ptrs 是什么?我不熟悉他们。
  • @Haxify 看here

标签: c++ memory struct memory-leaks


【解决方案1】:

内存泄漏是由于您从不释放子代造成的。
(将指针设置为 NULL 是不够的。)

你的析构函数可以这么简单:

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

【讨论】:

  • 我仍然有内存泄漏;我想这是程序其他部分的问题。无论如何,谢谢你,简单的析构函数!我会记住这一点的。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    相关资源
    最近更新 更多