2016-05-07 29 views
2

私はCSクラスのために働いており、私たちは独自の単純なハッシュテーブル実装を開発しています。Hashtable /二重リンクリストのメモリリーク

  • LISTE(これは二重にリンクされたリストである)
  • ハッシュテーブル(これはスロットのフレキシブル数を有する単純なハッシュテーブルである)
  • テスター(これはテストクラスである。この目的のために、私は複数のクラスを作成しましたキー比較をカウントして、それらをcsvファイルに出力します)

テスターは、実行ごとに新しいハッシュテーブルを生成します。たとえば、実行ごとに100回のテストを実行すると、古いハッシュテーブルが削除された後に新しいハッシュテーブルが作成されます。通常、テストのためにスロットの数が変化するため、これが必要です。

ハッシュテーブルの各スロットには、ハッシュテーブルのコンストラクタで作成された二重リンクリストへのポインタがあります。このリストには、値を挿入したり、値を探したり、最後の検索のためのキー比較を取得したり、すべての要素をクリアするためのメソッドが用意されています。デストラクタは、二重リンクリスト内のすべての要素をクリアするためのメソッドを呼び出します。デストラクタは実行の最後に呼び出され、デバッグメッセージでチェックされます。私は、以前に作成したメモリから同じ数の要素がクリアされているかどうかをチェックしようとしましたが、参照カウントは常に適合しています。

私の問題は、Testerを実行するたびに、より多くのメモリが割り当てられることです。ハッシュテーブル内の要素の数が多い実行または実行する場合、これはメガまたはギガバイトのメモリを必要とするため、実際の問題です。

私のIDEはOS X上のXcodeの最新バージョンです。私はInstruments(プロファイリングツール)を使用して漏れたコードを探しましたが、私の追加メソッドを見てみることを推奨します。

void Liste::clear() 
    { 
     cout << "Liste::clear() is fired." << endl; 
     Element *cursor = this->head; 

     while (cursor != NULL) 
     { 
      if(cursor->prev != NULL) 
      { 
       delete cursor->prev; 
       cursor->prev = NULL; 
       this->referenceCount--; 
      } 

      cursor = cursor->next; 
     } 

     delete cursor; 
     this->referenceCount--; 

     this->head = NULL; 
     this->tail = NULL; 
     this->size = 0; 
    } 

後:それはデストラクタによって発射されたときにもちろん

void Liste::add(int key, int wert) 
    { 
     Element *createdElement = new Element(); 
     this->referenceCount++; 

     createdElement->wert = wert; 
     createdElement->key = key; 

     if(this->head == NULL && this->tail == NULL) 
     { 
      this->head = createdElement; 
      this->tail = createdElement; 
     } 
     else 
     { 
      tail->next = createdElement; 
      createdElement->prev = this->tail; 
      this->tail = createdElement; 
     } 

     this->size++; 
    } 

が、これはメモリが割り当てられているところですが、私のクリア方法は、後にゲームの後半で、これらすべての要素を削除する必要がありますどのようなインストゥルメントが私にアドオンメソッドを教えているのかは、それが使用された後に解放されないメモリが割り当てられている唯一の場所なので、このメモリリークで私を助けてくれることを願っています。私は複数のプログラミング言語でいくつかの経験を持っていますが、私はC++でコードを作成するまでメモリ管理にこのような問題はありませんでした。

+0

意味のある支援を提供するには十分な情報ではありませんが、リストが空になるまでリンクされたリストの削除/消去機能を繰り返し呼び出す明確な機能が必要です。 2つのツールが役立つかもしれません。開発環境に付属のデバッガは、実行時にリストコードをステップ実行し、失われた要素を探すために使用します。メモリ管理に関しては、C++の大きな力はコストをかけることになります。 – user4581301

答えて

0

前のヌルがnullになるため、最後のカーソルを決して削除しないようです。 if(cursor-> prev!= null) ... Else カーソルを削除します。ブレーク;

また、常にnullであるため、他の削除カーソル呼び出しは必要ありません。