【发布时间】:2010-06-14 21:45:28
【问题描述】:
我正在为 10 个字符集构建一个后缀树(不幸的是,没有时间正确实现后缀树)。我希望解析的字符串会很长(最多 1M 个字符)。树的构建没有任何问题,但是,当我在完成后尝试释放内存时遇到了一些问题。
特别是,如果我将构造函数和析构函数设置为这样(其中 CNode.child 是指向由 10 个指向其他 CNode 的指针组成的数组的指针,而 count 是一个简单的无符号整数):
CNode::CNode(){
count = 0;
child = new CNode* [10];
memset(child, 0, sizeof(CNode*) * 10);
}
CNode::~CNode(){
for (int i=0; i<10; i++)
delete child[i];
}
尝试删除根节点时出现堆栈溢出。我可能是错的,但我相当肯定这是由于过多的析构函数调用(每个析构函数最多调用 10 个其他析构函数)。我知道这在空间和时间上都是次优的,但是,这应该是解决重复子字符串问题的快速而肮脏的解决方案。
tl;dr:如何释放被一棵非常深的树占用的内存?
感谢您的宝贵时间。
【问题讨论】:
-
如果您可以使用调试器获取堆栈跟踪,您就可以判断是否真的是您的析构函数导致了堆栈溢出。
-
只需更改节点指针即可将树转换为线性列表,然后从头到尾进行删除。
-
child = new CNode* [10]()将创建一个包含 10 个指针的数组,最初设置为 null。不需要任何memset。 -
@AndreyT:干杯,我知道有些事情看起来不对劲
-
为什么
CNode总是有 10 个指向它的孩子的指针?这不应该是动态的吗?这将消除对相同指针的重复delete调用。