0

それらがどのように機能するかを理解するために、独自のHashMapを作成しようとしています。リンクリストの配列を使用して、値(文字列)をハッシュマップに格納しています。

私は次のような配列を作成しています:

Node** list;

これの代わりに:

Node* list[nSize];

これは、実行時に配列を任意のサイズにすることができるようにするためです。しかし、私はこれをどのように行っているかによって、メモリリークが発生していると思います。エラーがどこにあるのかわかりませんが、次の簡単なコードを実行すると、.exeがクラッシュします。

アプリケーションがクラッシュするのはなぜですか?どうすれば修正できますか?

注:ベクトルを使用する方が配列よりもはるかに優れていることは承知していますが、これは学習のためだけのものであり、「動的」配列を使用してハッシュマップを作成することに挑戦したいと思います。PS:それは私が使用しているアレイの種類の正しい用語(動的アレイ)ですか?

struct Node
{
  // to implement
};

class HashMap
{
  public:
     HashMap(int dynSize)
     {
        *list = new Node[dynSize];
        size  = dynSize;  

        for (int i=0; i<size; i++)
            list[i] = NULL;

        cout << "END\n";
     }

     ~HashMap()
     {
        for (int i=0; i<size; i++)
           delete list[i];
     }

  private:
     Node** list; // I could use a vector here but I am experimenting with a pointer to an array(pointer), also its more elegant
     int    size;
};

int main()
{
   // When I run this application it crashes. Where is my memory leak?
   HashMap h(5);

   system("PAUSE");
   return 0;
}
4

2 に答える 2

1

三つのルールに従う必要があります。

動的に割り当てられたメンバーのディープコピーを作成するコピーコンストラクターとコピー代入演算子を提供します。

その上、

 Node** list; 
 *list = new Node[dynSize];

初期化されていないポインタを尊重するだけです。*list初期化されていないため、意味のあるものを指していませんlist

于 2012-12-15T04:23:27.770 に答える
0

Alok Saveが述べたように、初期化されていないポインタを逆参照しています。ここで重要なのは、2ステップの初期化を必要とするダブルポインタがあることです。まず、メモリを次の場所に割り当てる必要がありますlist

// note that I'm using 'X', simply using 'size' doesn't work for two dimensions
list = new Node*[X];

Xノードポインタができたので、それぞれをYノードに向ける必要があります。

for (int i = 0; i < X; i++)
    list[i] = new Node[Y];

newがメモリを割り当てることができない場合は、エラー処理を実行することをお勧めしますが、これにより、少なくともNode**が構築されます。

delete[]これを破棄するには、逆の順序で実行しますが、を割り当てたので、忘れずに使用してくださいnew[]

for (int i=0; i < X; i++)
    delete[] list[i];
delete[] list;
于 2012-12-15T05:00:01.577 に答える