2017-01-13 53 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

你能展示更多'堆'嗎? –

+3

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

+5

'if(values)delete [] values;'不應該在構造函數中完成。 – NathanOliver

回答

4

在拷貝構造函數你有

if(values) delete [] values; 

由於我們是在拷貝構造函數沒有一個成員,除非你在成員初始化列表中指定它們已被初始化的。如果不是,它們或者是默認構造的,如果它們是默認可構造的,或者如果它們不是,則保持不確定狀態。由於value是一個指針,它的狀態是不確定的,這意味着評估它並刪除它是未定義的行爲。

2

請記住,複製構造函數只是一個類似於默認構造函數的構造函數。當調用複製構造函數時,對象不是初始化的。

這意味着像value該成員變量(我假定是一個成員變量)不被初始化,其值將是不確定的。當您使用它時,您將有未定義的行爲