我想从我分配的二叉树中释放内存,这样做最好的遍历是什么?
typedef struct Node{ struct Node * right; struct Node * left; void * data; }Node; typedef int (*cmp) (void*,void *); Node* init(void * element){ Node * newNode=(Node*)malloc(sizeof(Node)); newNode->data=element; newNode->left=NULL; newNode->right=NULL; return newNode; } void insert(void * element, Node** root,cmp compareTo){ if(*root==NULL){ *root=init(element); return; } if(compareTo(element,(*root)->data)==1) insert(element,&((*root)->left),compareTo); else insert(element,&((*root)->right),compareTo); }
既然它是一棵树,你应该采用递归方法。
deallocate (node): //do nothing if passed a non-existent node if node is null return //now onto the recursion deallocate(left node) deallocate(right node) free node
考虑一下不同的遍历类型的作用,并记住,在你释放内存后,你不再允许访问它:
鉴于上述陈述,答案应该清楚。
void free_tree(Node * node){ //post-order like FatalError hinted at if (node != NULL) { free_tree(node->right); free(node->data); //if data was heap allocated, need to free it free_tree(node->left); free(node); }}
检查seg故障和内存泄漏的一种很酷的方法是使用
valgrind --leak-check=full ./yourProgram
深度优先搜索是最好的
当你说“最好”时你的意思是“正确”(即,通过访问释放的内存不会导致混乱)或“最有效”或什么?
正确性如下:任何你喜欢的东西,只要你在释放数据后注意不要访问数据。 明显最简单的方法(我不会明确说明,因为这看起来有点像家庭作业:-)但如果你想编写尽可能少的代码,那就是你要做的事情[编辑添加:这就是“cnicutar”发布的内容; 我希望它毕竟不是功课!])工作得很好。
通过适当匹配释放顺序和分配顺序,您可以获得更高效的结果(空间或时间),但细节取决于您的内存分配器,您可能不应该关心。
以上就是c/c++开发分享释放二叉树C的记忆相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/545013.html