如何释放被树占用的内存
How do i free up memory occupied by a tree?
树中的每个节点都有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);
}
};
只需删除即可。删除节点子级的部分应该在节点类的析构函数中,而不是在外部。如果你不把它放在那里,删除不是递归的,所以你会泄露孙节点及其子树。
如果你想真正掌握技术并练习你的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++-如何使用裸新初始化智能点?
只需找到答案。
相关文章:
- 内存未释放 std::list<std::shared_ptr<std::string>> C++
- 整数内存分配/释放
- 使用删除与智能指针释放内存以及释放内存的正确方法
- 在 C++ 中分配的内存的释放::字符串
- C++内存分配/释放和自由空间错误
- 当c++程序结束时,指针会从内存中释放吗
- 为什么我的程序内存不释放?
- 当类对象完成时,是否为 C++ 类的数据成员动态分配的内存会释放
- 为什么函数调用后内存不释放
- 内存在释放后似乎没有被较低级别的分配例程释放
- C++自动内存:何时释放
- 如何确保在MULTIMAP的情况下分配的内存被释放
- 堆栈内存未释放
- C++堆栈内存未释放
- 指针的内存分配/释放
- 内存分配/释放错误(非常小的代码)
- 内存泄漏-释放和删除
- c++堆内存分配/释放
- 在c++程序中,分配内存然后释放内存是否构成副作用?
- 关于从内存中释放链表的析构函数的逻辑和作用域的问题