我正在爲10個字符集建立後綴trie(不幸的是,沒有時間正確實現後綴樹)。我想分析的字符串將會相當長(最多1M字符)。這棵樹的構造沒有任何問題,但是當我嘗試釋放內存後,我遇到了一些問題。在非常深的樹上刪除
在具體地,如果設置我構造和析構是這樣(其中CNode.child是指向的10個指向其他CNodes陣列,並且計數是一個簡單的無符號整數):
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:如何解放一棵很深的樹佔用的內存?
謝謝你的時間。
如果你可以使用一個調試器獲得堆棧跟蹤,你可以告訴它是否真的是你的析構函數導致堆棧溢出。 – strager 2010-06-13 14:42:32
只需更改節點指針即可將樹轉換爲線性列表,然後只需從頭至尾刪除即可。 – 2010-06-13 14:44:10
'child = new CNode * [10]()'將創建一個最初設置爲null的10個指針的數組。不需要任何'memset'。 – AnT 2010-06-13 15:02:01