From 317fdc10a3d537fd87b855c4b8714b2472cde608 Mon Sep 17 00:00:00 2001 From: nvalimak Date: Mon, 9 Mar 2009 15:09:55 +0000 Subject: [PATCH 1/1] Quick fix for WT construction space git-svn-id: svn+ssh://idea.nguyen.vg/svn/sxsi/trunk/XMLTree@227 3cdefd35-fc62-479d-8e8d-bae585ffb9ca --- .../static_sequence_wvtree.cpp | 7 ++-- .../src/static_sequence/wt_node_internal.cpp | 33 +++++++++++++++---- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/libcds/src/static_sequence/static_sequence_wvtree.cpp b/libcds/src/static_sequence/static_sequence_wvtree.cpp index d5713ce..e86da89 100644 --- a/libcds/src/static_sequence/static_sequence_wvtree.cpp +++ b/libcds/src/static_sequence/static_sequence_wvtree.cpp @@ -40,9 +40,10 @@ static_sequence_wvtree::static_sequence_wvtree(uchar * symbols, uint n, wt_coder am->use(); this->c=c; c->use(); - root = new wt_node_internal(symbols, n, 0, c, bmb); - for(uint i=0;iunmap((uint)symbols[i]); + root = new wt_node_internal(symbols, n, 0, c, bmb); + symbols = 0; // Already deleted! +// for(uint i=0;iunmap((uint)symbols[i]); } static_sequence_wvtree::static_sequence_wvtree() {} diff --git a/libcds/src/static_sequence/wt_node_internal.cpp b/libcds/src/static_sequence/wt_node_internal.cpp index 9dc87a2..f5312db 100644 --- a/libcds/src/static_sequence/wt_node_internal.cpp +++ b/libcds/src/static_sequence/wt_node_internal.cpp @@ -70,6 +70,7 @@ wt_node_internal::wt_node_internal(uint * symbols, uint n, uint l, wt_coder * c, delete [] right; } +// Deletes symbols array! wt_node_internal::wt_node_internal(uchar * symbols, uint n, uint l, wt_coder * c, static_bitsequence_builder * bmb) { uint * ibitmap = new uint[n/W+1]; for(uint i=0;i0) { if(match_left/* && c->done(left[0],l+1)*/) - left_child = new wt_node_leaf((uint)left[0], count_left); + { + left_child = new wt_node_leaf((uint)left[0], count_left); + delete [] left; + left = 0; + } else - left_child = new wt_node_internal(left, count_left, l+1, c, bmb); + { + left_child = new wt_node_internal(left, count_left, l+1, c, bmb); + left = 0; // Already deleted + } } else { left_child = NULL; } if(count_right>0) { if(match_right/* && c->done(right[0],l+1)*/) - right_child = new wt_node_leaf((uint)right[0], count_right); - else - right_child = new wt_node_internal(right, count_right, l+1, c, bmb); + { + right_child = new wt_node_leaf((uint)right[0], count_right); + delete [] right; + right = 0; + } + else + { + right_child = new wt_node_internal(right, count_right, l+1, c, bmb); + right = 0; // Already deleted + } } else { right_child = NULL; } - delete [] left; - delete [] right; +// delete [] left; // already deleted +// delete [] right; } -- 2.17.1