2014-11-24 66 views
-5

我知道這個錯誤來自雙重刪除分配的內存,理論上我知道該怎麼做。但它似乎不應該如此。或者我搞錯了。請幫忙。 這裏是我的類代碼:動態分配的數組,雙重空閒或損壞

typedef int SIZE_TYPE; 

template<typename T> 
class CArrays{ 
private: 
    SIZE_TYPE size; 
    T * tab; 
public: 
     // methods... 
    }; 


template<typename T> 
CArrays<T>::CArrays(T value, SIZE_TYPE argsize){ 

    size = argsize; 
    tab = new T[size]; 
    for(SIZE_TYPE i = 0; i < size; i++) 
     *(tab+i) = value; 
    } 

template<typename T> 
CArrays<T>::~CArrays(){ 

    delete [] tab; 

} 

template<typename T> template<typename J> 
CArrays<T> & CArrays<T>::operator=(const CArrays<J> &rhs){ 
    if(&rhs != this){ 
     this->size = rhs.size; 
     delete [] this->tab; 
     this->tab = new T[this->size]; 
     memcpy(this->tab, rhs.tab, sizeof(J) * rhs.size); 

    } 
    return *this; 
} 

當我做我的main.cpp某事像那:

CArrays<int> a(3, 10), b(0, 10); 
b = a; 

*** glibc detected *** ./out: double free or corruption (fasttop): 0x000000000087b010 *** 
+0

你錯過了複製構造函數。 – PaulMcKenzie 2014-11-24 20:29:48

+0

對MCVE進行凝聚並不意味着任意刪除東西。重要的事情,如ctors,dtors,op =和其他任何可能相關的都應該保留。 – Deduplicator 2014-11-24 20:30:22

+0

@PaulMcKenzie:可能,儘管我們不能說。他太多了。 – Deduplicator 2014-11-24 20:32:07

回答

1

有幾件事情你的代碼錯誤:

用法memcpy複製數據。

如果模板類型T是非POD類型,則不能使用memcpy複製數據。您必須逐個複製項目,或使用std::copy

如果您還沒有編碼一個,則缺少複製構造函數。

這是它應該是什麼樣子:

template<typename T> 
CArrays<T>::CArrays<T>(const CArrays<T> &rhs) 
{ 
    tab = new T[rhs.size]; 
    for (size_t i = 0; i < rhs.size(); ++i) 
     tab[i] = rhs[i]; 
    size = rhs.size; 
} 

賦值運算符是特殊的。

也許沒有錯,但很奇怪。一個賦值運算符/應該是這樣的(因爲拷貝構造函數和析構函數都正常工作):

#include <algorithm> 

template<typename T> 
CArrays<T>& CArrays<T>::operator=(const CArrays<T> &rhs) 
{ 
    CArrays<T> temp(rhs); 
    std::swap(temp.size, size); 
    std::swap(temp.tab, tab); 
    return *this; 
} 

上述工作,由於複製和換出一個臨時對象的內部與現有的對象,並讓臨時死亡。

在最後兩項中,我假設唯一的成員是tabsize。如果還有其他成員,請在上面的代碼中複製它們(並將其交換出去)。

+0

謝謝你的回答。特別是對於memcpy的使用。現在一切正常。 – hal 2014-11-24 20:53:01