动态分配数组,双重释放或损坏

时间:2014-11-24 20:26:27

标签: c++ dynamic-memory-allocation

据我所知,这个错误来自双重删除已分配的内存,理论上我知道该怎么做。但它似乎并没有按照应有的方式运作。或者我做错了。请帮忙。 这是我班级的代码:

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 ***

1 个答案:

答案 0 :(得分: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。如果还有其他成员,请在上面的代码中复制它们(并将它们换掉)。