【发布时间】:2017-06-11 07:07:16
【问题描述】:
我正在做作业,要求我在不使用向量的情况下实现 Trie 树。我有一个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中。那么每个TrieTreeNode 的_children 成员只是一个数组,其元素是int32_t 到nodes_array 的索引。
例如,假设我们有TrieTreeNode * parent。要访问它的第一个孩子,我们使用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;
}
但是,当我同时使用-ps -l 命令和 GDB 来监控我的程序在删除树之前和之后的内存使用情况时,内存只减少了一点点。 RRS 从 13744 变为 13156,而在我构建树之前它只有 1072。
任何建议将不胜感激!
【问题讨论】:
-
为什么你不使用析构函数而不是
delete_node/delete_tree?而typedef struct在 C++ 中是不必要的。 -
"为了减少内存使用,我将 TrieTreeNode 的所有指针存储到一个全局变量 TrieTreeNode ** nodes_array" 你为什么认为使用全局变量会减少内存使用?为什么你认为减少内存使用很重要?此外,C++ 不需要那个 typedef。
-
@NeilButterworth 我认为也没有必要,但是这项作业的一个要求是减少内存。我认为使用
int32_t而不是 64 位指针可能更有效。这可能是错误的,所以我也期待您的建议。 -
谁投了反对票,请留下您的评论,以便我改进我未来的问题。谢谢。
-
即使不允许使用
std::vector和智能指针,也请开始编写自己的类来处理它,然后在此基础上进行构建。
标签: c++ pointers memory memory-management struct