如何在C ++中删除动态分配的包含动态分配的数组成员的结构?

时间:2017-01-25 22:27:53

标签: c++ pointers memory memory-management struct

我正在做我的作业,这要求我在不使用矢量的情况下实现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。

任何建议都将不胜感激!

1 个答案:

答案 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]以释放每个节点的剩余内存。

就个人而言,我是为结构定义构造函数和析构函数的粉丝,这样我就不必记住在我创建它们的地方初始化它,或者在我可能处理的任何地方进行额外的删除。