数据结构中的双重释放或损坏

double free or corruption in data structures

本文关键字:释放 损坏 数据结构      更新时间:2023-10-16

我在下面有代码,我在其中实现了堆队列。

Queue<Heap<struct infoNode>, SIZE> queue;     
for(int c = 0 ; c < SIZE; c++)
{    
     Heap<struct infoNode> h;
     queue.enqueue(h, 0);
}   

在堆中,我重载了复制构造函数,如下所示:

template <typename T>
Heap<T>::Heap(const Heap<T> &h)
{
        cout << "this " << this << " h " << &h << endl;
        capVect = h.capVect;
        if(values) delete [] values;
        values = new T[capVect];
        dimVect = h.dimVect;
        for(int i = 0; i < dimVect; i++)
            values[i] = h.values[i];
}

当我做queue.enqueue(h, 0)时,我得到双重自由或腐败。我不明白为什么我在这里看到相同的地址和要复制的堆。

this 0x7ffcbc2771a0 h 0x7ffcbc277190
this 0x7ffcbc2771a0 h 0x7ffcbc277190
*** Error in `./comp': double free or corruption (top): 0x00000000017f0690 ***
Aborted (core dumped)

在复制构造函数中,你有

if(values) delete [] values;

由于我们位于复制构造函数中,因此除非您在成员初始值设定项列表中指定它们,否则尚未初始化任何成员。 如果不是,则默认构造它们(如果它们是默认可构造的)或处于不确定状态(如果它们不是)。 由于value是一个指针,因此其状态是不确定的,这意味着评估它并删除它是未定义的行为。

请记住,复制构造函数只是像默认构造函数一样的构造函数。当调用复制构造函数时,对象不初始化。

这意味着像value这样的成员变量(我假设它是一个成员变量)没有初始化,并且它的值将是不确定的。当您使用它时,您将具有未定义的行为