我树中的每个节点都有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);
}
};
答案 0 :(得分:2)
删除它。删除节点子节点的部分应该在节点类的析构函数中,而不是在外部。如果你没有把它放在那里,删除不是递归的,所以你将泄漏孙子节点及其子树。
答案 1 :(得分:1)
如果你想获得真正的技术并练习你的C ++ 11,我会建议使用智能指针。为了清楚起见,我会将所有销毁机制都放到析构函数中,但智能指针对c ++来说是一件好事,所以练习时你应该使用它们。
所以你应该声明这样的东西:
//don't forget to #include<memory>
std::unique_ptr<int> NstateAction;
//don't use vectors as arrays, if the standard library has an alternatve you should use it
std::vector<unique_ptr<int>> child;
std::unique_ptr<double> QValue;
智能指针是一些指针,当它们超出范围时会自动释放内存,所以这应该可以解决问题。
现在使用智能指针有点棘手,但这是一个有用的问题:
c++ - How can i initialize a smart point using a naked new?
回答问题。