双重免费或数据结构中的损坏

时间:2017-01-13 12:46:00

标签: c++

我有下面的代码,我实现了一堆堆。

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)

2 个答案:

答案 0 :(得分:4)

在复制构造函数中

if(values) delete [] values;

由于我们在复制构造函数中,除非您在成员初始化列表中指定它们,否则没有任何成员已初始化。如果不是,如果它们是默认构造的,则它们是默认构造的,或者如果它们不是,则它们是不确定的。由于value是一个指针,它的状态是不确定的,这意味着对它进行评估并删除它是未定义的行为。

答案 1 :(得分:2)

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

这意味着成员变量如M12=886(我假设是成员变量)未初始化,其值将 indeterminate 。使用它时,您将有未定义的行为