【发布时间】:2014-04-18 02:58:32
【问题描述】:
我的树中的每个节点都有 M 个孩子。其中一些可能为 NULL。在我完成树之后,我递归地遍历树的每个元素并删除它,但这并没有释放程序使用的内存。首先我在没有定义析构函数的情况下尝试了这个,然后在定义析构函数之后也没有帮助。请告诉我释放内存空间的错误在哪里。我删除树的代码如下:-
void deleteTree(node* s)
{
if(s==NULL)
return ;
else
{
for (int i=0 ; i < M ; i++)
{
deleteTree(s->child[i]);
}
delete(s);
}
}
一个节点包含一个字符串向量、整数数组和指向其子节点的指针数组。
struct node
{
vector<string> stateBoard;
int Nstate;
int *NstateAction;
node** child;
int depth;
double Q;
double *Qvalue;
node()
{
Nstate=0;
depth = 0;
NstateAction = new int[M];
Qvalue = new double[M];
child = new node *[M]; //
for( int i=0 ; i < M ; i++)
{
NstateAction[i] = 0;
child[i]=NULL;
}
}
~node()
{
stateBoard.clear();
vector<string>(stateBoard).swap(stateBoard);
}
};
【问题讨论】:
-
在您使用
new[]创建的所有内容上使用delete[]。你的结构需要一个复制构造函数和赋值运算符。 -
我没有在任何地方复制,那为什么我需要一个复制构造函数呢?
-
对于 delete[] ,我将 for 循环替换为 delete[] s->child;但即使这样也不会释放空间。
-
如果您不在任何地方复制 - 则禁止复制,以免意外编写尝试复制的代码。
-
您需要自己的复制构造函数。否则编译器会生成一个,这可能不是你喜欢的,并在你不期望它的地方调用它,同上。如果你真的认为你不是在复制,请声明它但不要定义它,或者删除它 (C++11)。
标签: c++ memory memory-management tree