2017-05-10 15 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 ::ベクトル<はstd :: unique_ptrを>'任意のリークを避けるために。 – Jarod42

+3

'rightorleft [l] = true'は、あなたが「コーヒーやお茶」を聞いたときに「はい」と答える迷惑な人々のようです。 'enum Direction {左、右};やそれに類するものを使用してください。 – molbdnilo

答えて

1

あなたがdelete[] roadnodes;ます暗黙的にdelete roadnodes[0]; delete roadnodes[1]; ...かどうかを確認している場合、答えはノーです。それは絶対にしません。あなたはそれらを削除する責任があります。いくつかのコメントで示唆されているように、標準的なコンテナとスマートポインタを使用する方がずっと良い方法です。

+0

本当にありがとう。私は実際に内容を保持したいが、ポインタを削除したい。私はこの状況で大丈夫だと思いますか? – MrSn0w

+0

「内容を保持する」または「内容を削除する」という用語は、私がさらに答えようとしないということを十分に混乱させます。 –

1

動的配列を削除すると、ポインタの内容も削除されるかどうかです。

動的配列でdeleteを呼び出すと、各要素のデストラクタが呼び出されます。あなたは、生のポインタにはデストラクタがないと思うかもしれません。そうでないと、そのメモリは解放されません。つまり、デストラクタがメモリを解放するスマートポインタを使うか、ポインタを手動で削除する必要があります。

関連する問題