C++ 动态分配数组,双重释放或损坏
我知道这个错误来自于双重删除分配的内存,理论上我知道应该怎么做。但它似乎没有按应有的方式工作。或者我做错了什么。请帮忙。 这是我的班级代码:C++ 动态分配数组,双重释放或损坏,c++,dynamic-memory-allocation,C++,Dynamic Memory Allocation,我知道这个错误来自于双重删除分配的内存,理论上我知道应该怎么做。但它似乎没有按应有的方式工作。或者我做错了什么。请帮忙。 这是我的班级代码: typedef int SIZE_TYPE; template<typename T> class CArrays{ private: SIZE_TYPE size; T * tab; public: // methods... }; template<typename T> CArra
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 ***
您的代码有几处错误: 使用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两个成员。如果有其他成员,请同时复制它们并在上面的代码中交换它们。您缺少复制构造函数。将某些内容压缩到MCVE并不意味着任意删除这些内容。重要的东西,如系数、DTOR、op=和其他可能相关的东西都应该保留。@PaulMcKenzie:可能,尽管我们不能说。他昏厥了太多。也许最简单的解决办法是使用std::vector。然后你所有的分配问题就消失了。仅根据您输入的代码,当T或J为非POD或大小不同时,运算符=将中断。此外,如果模板类型为非POD,则不能使用memcpy复制数据。但是这个赋值操作符看起来非常不正统。在这里使用模板的目的是什么?谢谢你的回答。特别是对于memcpy的使用。现在一切正常。