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