据我所知,这个错误来自双重删除已分配的内存,理论上我知道该怎么做。但它似乎并没有按照应有的方式运作。或者我做错了。请帮忙。 这是我班级的代码:
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 :(得分: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;
}
以上工作原理是由于复制并使用现有对象交换临时对象的内部结构,并暂时关闭。
在最后两项中,我假设唯一的成员是tab
和size
。如果还有其他成员,请在上面的代码中复制它们(并将它们换掉)。