2017-01-13 14 views
2

私はヒープのキューを実装する以下のコードを、持っています。ヒープでダブル無料または破損

Queue<Heap<struct infoNode>, SIZE> queue;  
for(int c = 0 ; c < SIZE; c++) 
{  
    Heap<struct infoNode> h; 
    queue.enqueue(h, 0); 
} 

、私はこのようなコピーコンストラクタをオーバーロードしています

template <typename T> 
Heap<T>::Heap(const Heap<T> &h) 
{ 
     cout << "this " << this << " h " << &h << endl; 
     capVect = h.capVect; 
     if(values) delete [] values; 
     values = new T[capVect]; 
     dimVect = h.dimVect; 
     for(int i = 0; i < dimVect; i++) 
      values[i] = h.values[i]; 
} 

私はqueue.enqueue(h, 0)を作るとき、私は二重の無料または破損を取得。なぜ私はこれとコピーするヒープのために同じアドレスを参照しているのかわかりません。

this 0x7ffcbc2771a0 h 0x7ffcbc277190 
this 0x7ffcbc2771a0 h 0x7ffcbc277190 
*** Error in `./comp': double free or corruption (top): 0x00000000017f0690 *** 
Aborted (core dumped) 
+0

あなたは 'Heap'の多くを示していることはできますか? –

+3

http://stackoverflow.com/help/mcve – melpomene

+5

'if(values)delete [] values;'はコンストラクタで行うべきではありません。 (値)は、コンストラクタで[]の値を削除した場合 – NathanOliver

答えて

4

が初期化されています。そうでない場合は、デフォルトで構築可能な場合はデフォルトで構築され、そうでない場合は不確定な状態になります。 valueはポインタであるため、その状態は不定であり、それを評価することを意味し、それを削除することは未定義の動作です。

2

コピーコンストラクタは、デフォルトコンストラクタのような単なるコンストラクタであることに注意してください。コピーコンストラクタが呼び出されると、オブジェクトは初期化されません。 (私はメンバ変数であると仮定value状部材変数が初期化されず、その値は不定であろうことを意味

。それを使用すると、の定義されていない動作が発生します。あなたがメンバー初期化子リストでそれらを指定しない限り、私たちはメンバーのコピーコンストラクタなしであるので、あなたは

if(values) delete [] values; 

を持っているコピーコンストラクタで

関連する問題