2017-05-10 84 views
1

我想創建一個AVL樹,我正在使用指針的動態數組來跟蹤哪些節點受插入的影響。我的問題是如果刪除動態數組將刪除內容代碼還沒有完成,但我認爲它會給你一個我的意思的想法。如果它不工作,那麼我應該怎麼做呢?在此先感謝。刪除指針陣列

treenode *newnode,**roadnodes,*parent ; 
int x=(int)log(numberofnodes)+2,l=0 ; 
bool *rightorleft,flag=true ; 
newnode=new treenode ; 
roadnodes=new treenode*[x] ; 
rightorleft=new bool[x] ; 
newnode->id=i ; 
newnode->hl=0; 
newnode->hr=0; 
newnode->hm=0; 
newnode->left=NULL; 
newnode->right=NULL ; 
if(head==NULL) 
{ 
    delete[] roadnodes ; 
    delete[] rightorleft ; 
    numberofnodes++ ; 
    head=newnode ; 
    return true ; 
} 
parent=head ; 
while(flag) 
{ 
    roadnodes[l]=parent ; 
    if(parent->id>i) 
    { 
     if(parent->left) 
      parent=parent->left ; 
     else 
     { 
      flag=false ; 
      parent->left=newnode ; 
     } 
     rightorleft[l]=true ; 
     l++ ; 
    } 
    else 
    { 
     if(parent->right) 
      parent=parent->right ; 
     else 
     { 
      flag=false ; 
      parent->right=newnode ; 
     } 
     rightorleft[l]=false ; 
     l++ ; 
    } 

} 
return true ; 
+3

這個問題剛剛消失,如果你使用智能指針代替人工內存管理.. –

+3

'的std ::的unique_ptr '和'的std ::向量<性病::的unique_ptr >',以避免任何泄漏。 – Jarod42

+3

'rightorleft [l] = true'就像那些煩人的人,當你問「咖啡或茶?」時,他們會回答「是」。使用'枚舉方向{左,右};'或類似的東西。 – molbdnilo

回答

1

如果你問是否delete[] roadnodes;會隱delete roadnodes[0]; delete roadnodes[1]; ...,答案是否定的。它絕對不會。你有責任刪除它們。正如一些評論中所建議的那樣,使用標準容器和智能指針是更好的方法。

+0

非常感謝。我確實想保留內容但刪除指針。所以我想我在這種情況下可以嗎? – MrSn0w

+0

術語「保留內容」或「刪除內容」充分混淆,我不打算進一步回答。 –

1

問題是如果刪除動態數組也會刪除指針的內容。

當您在動態數組上調用delete時,將調用每個元素的析構函數。正如你可能猜測原始指針沒有析構函數,或者它是一個noop,所以不是,那個內存不會被釋放。所以你要麼使用智能指針,這些指針會釋放內存,或者你需要手動爲每個指針調用delete。