2011-12-30 10 views
1

structヒープのデストラクタに問題があります。 1つを追加するだけで、それを使用しない場合は、実行時例外(メモリアクセス)が作成されます。私はそれをやろうとする二日目であり、明日は締め切りです。デストラクタ定義を追加すると実行中例外が発生する

struct Heap 
{ 
     int n; 
     int* tab; 
     int* numerWKopcu; 

     Heap() { n=0; } 
     Heap (int size) { this->tab = new int[liczbaDomow]; n=0; this->numerWKopcu = new int[2000100];} 
     int max() { return tab[1]; } 
     bool empty() { return n==0; } 

     bool insert(int x) 
     { 
      n++; 
      tab[n]=x; 
      this->numerWKopcu[x] = n;//ZMIANA 
      upHeap(n); 
      return true; 
     }   

     bool delMin() 
     { 
      if (n<1) return false; 
      this->numerWKopcu[tab[n]] = 1; //ZMIANA 
      tab[1]=tab[n]; n--; 
      downHeap(1); 
      return true; 
     } 

    void upHeap(int x){ 
     int p; 
     int mem = tab[x]; 
     while (x>1) 
     { 
      p=x/2; 
      if (color[mem]>color[tab[p]]) break; 
      this->numerWKopcu[tab[p]] = x; //ZMIANA 
      tab[x]=tab[p]; 
      x=p; 
     } 
     this->numerWKopcu[mem] = x;//ZMIANA 
     tab[x]=mem; 
    } 

    void downHeap (int x) 
    { 
     int s=2*x; 
     int mem=tab[x]; 
     while(s<=n) 
     { 
      if (s+1<=n && color[tab[s]]>color[tab[s+1]]) 
       s++; 
      if (color[mem]>color[tab[s]]) 
      { 
       this->numerWKopcu[tab[s]] = x; //ZMIANA 
       tab[x]=tab[s]; 
       x=s; 
       s=2*x; 
      } 
      else break; 
     } 
     this->numerWKopcu[mem] = x;//ZMIANA 
     tab[x]=mem; 
    } 

    void write() 
    { 
     for (int i=1;i<=n;i++) printf ("%d) %d\n", i, tab[i]); 
     printf ("\n"); 
    }  

    void build() 
    { 
     int s = n; 
     for (s=n/2; s>=1; s--) downHeap(s); 
    } 
    /~Heap() { 
      delete []this->numerWKopcu; 
      delete []this-> tab; 
      }; 
}; 
+0

正確なエラーメッセージを投稿してください... – Nick

+0

このコードは不完全です(例えば、 'liczbaDomow'は未定義です)、英語以外の変数名を使用しています。どちらも人々があなたを助けることを非常に難しくします – thiton

+0

デバッガで実行しようとしましたか? –

答えて

2

コードが読み少し難しいですが、私は二つの問題を参照してください。

  • あなたはとてもデフォルト・構築物を破壊し、デフォルトコンストラクタ内のNULLへのポインタを初期化されていませんが、未定義の動作を提供します。
  • コピーコンストラクタとコピー代入演算子を定義したり削除したりしないでください(デストラクタを定義した場合は常にRule of Three)ので、コピーされたオブジェクトを破棄すると未定義の動作が発生します。

また、配列境界外のメモリにアクセスしている可能性があります。 valgrindなどのメモリデバッグツールを使用すると、それが起こっているかどうかを判断するのに役立ちます。

最も簡単な解決策は、手動管理アレイをstd::vectorに置き換えることです。独自のデストラクタやコピーセマンティクスを書くことについて心配する必要はありません。また、[]ではなく、at()を使用することもできます(少なくともデバッグのバリエーションでは)、レンジチェックされたアクセスを提供します。

+0

ASD-Algorythmsとデータ構造用です。 #include #include 私は境界から外れていません。私は定義されているデストラクタを初期化していません。 – Yoda

+0

@RobertKilar:問題を再現する短いコンパイル可能なプログラムを投稿すると、さらに役立つかもしれません。そうであるように、明らかな問題を指摘する以上のことをするのは難しいです。 –

+0

ありがとう、私はちょうどそれがあまりにも費用がかかる削除の原因を使用しないことにしました。私はちょうどint [2000100]を初期化しました。私が必要としているすべてのプログラムで、プログラムは20秒から約0.3秒にブーストされました。コード全体には394行があるので、読み込みできません。 ありがとうございました! – Yoda

1

デフォルトのコンストラクタでポインタを初期化していません。デフォルトの構築されたヒープを破壊しようとすると、デストラクタ内のランダムなメモリ領域を削除しようとしますが、間違いなく破壊されます。

+0

これは決して使用されません。私はそれを次のように変更しました: \t \tヒープ(){n = 0; this-> tab =新しいint [liczbaDomow]; this-> numerWKopcu = new int [2000100]; } しかし、INSERT機能でタブ[n] = xにエラーがあります。 xとnはコンピュータには知られていません – Yoda

関連する問題