Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 动态分配数组,双重释放或损坏_C++_Dynamic Memory Allocation - Fatal编程技术网

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的使用。现在一切正常。