我正在做我的作业,这要求我在不使用矢量的情况下实现Trie Tree。我的struc
定义如下:
typedef struct{
char _name;
int32_t * _children;
int32_t _children_size;
int32_t _children_capacity;
int32_t * _location;
int32_t _location_size;
int32_t _location_capacity;
} TrieTreeNode;
为了减少内存使用,我将TrieTreeNode
的所有指针存储到全局变量TrieTreeNode ** nodes_array
中。然后,每个_children
的{{1}}成员只是一个数组,其元素为TrieTreeNode
索引到int32_t
。
例如,假设我们有nodes_array
。要访问其第一个孩子,我们使用TrieTreeNode * parent
。
我的问题是如何删除整个Trie Tree?我尝试了以下方法(nodes_array[parent -> _children[0]]
是指针tail
的数量):
nodes_array
但是,当我在删除树之前和之后使用void delete_node(TrieTreeNode *node){
delete [] node -> _children;
delete [] node -> _location;
}
void delete_tree(){
for (int i = 0; i < tail; i++){
delete_node(nodes_array[i]);
}
delete [] nodes_array;
nodes_array = NULL;
}
命令和GDB来监视程序的内存使用时,内存只会略微减少。 RRS从13744到13156,而在构建树之前只有1072。
任何建议都将不胜感激!
答案 0 :(得分:1)
您不是删除节点,只删除每个节点中的指针。
考虑一下:
void delete_tree(){
for (int i = 0; i < tail; i++){
delete_node(nodes_array[i]);
delete node_array[i]; // Delete the node itself.
}
delete [] nodes_array;
nodes_array = NULL;
}
在调用delete_node
释放每个节点中的两个指针后,您应该删除节点本身delete node_array[i]
以释放每个节点的剩余内存。
就个人而言,我是为结构定义构造函数和析构函数的粉丝,这样我就不必记住在我创建它们的地方初始化它,或者在我可能处理的任何地方进行额外的删除。