2016-04-18 15 views
1

下の展開機能に間違った何かが見えますか?私はいくつかのコンテキストを与えるために、クラスのプライベートセクションと私のvertex_node構造体を含めました。なぜそれが適切に拡大していないのか分かりません。どんな助けもありがとう。グラフの展開機能が適切に展開されていません

private: 

//list is pointers to vertex nodes; 

struct vertex_node { 
      string name; 
      set <string> edges; 
}; 

vertex_node **list; 

void Graph:: expand() 
{ 

    int new_cap = capacity * 2+1; 
    //creates new larger array 
    vertex_node **larger_array = new vertex_node*[new_cap]; 

    //loop through all elements of old array 
    for(int i = 0; i<capacity; i++){ 
     if(list[i] != NULL){ 

     //rehash each element and place it in new array 
     int a = hash_string(list[i]->name) % new_cap; 

     larger_array[a]   = new vertex_node; 
     larger_array[a]->name = list[i] -> name; 
     larger_array[a]->edges = list[i] -> edges; 
    } 

    //delete old list 
    delete[] list; 
    list = larger_array; 
    capacity = new_cap; 
    } 
} 
+0

「容量」とは何ですか?どのように初期化されますか?あなたは、[最小、完全で、かつ実証可能な例](http://stackoverflow.com/help/mcve)を作成して私たちを見せてください。 –

+2

'delete [] list'は' list'の各要素で 'i'を繰り返しながら実行され、各繰り返しごとにgreater_arrayにも割り当てられ、次の繰り返しが削除されます。しかし、実際のコードが適切にコピーされていない可能性があります。 –

+1

ちなみに 'new'は初期化されませんが、デフォルトのコンストラクタがあれば呼び出されますが、ポインタや他のネイティブ型(' int'や 'double'など)にはデフォルトはありませんコンストラクタ。つまり、あなたが割り当てた配列内のポインタは* indeterminate *値を持ち、 'list [i]!= NULL'のチェックがあるときは*未定義の動作*を与えます。私はあなたが行うことをお勧めします。 'new vertex_node * [new_cap](nullptr)'を実行すると、すべてのポインタがNULLポインタに初期化されます。そして、最初の割り当てのために同じことをしてください。 –

答えて

1

上記の私のコメントで述べたように、最初の繰り返しの最後に配列全体が無効になります。メモリリークを回避しようとすると、2つの場所で処理する必要があります。