我有下面的代码,我实现了一堆堆。
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)
答案 0 :(得分:4)
在复制构造函数中
if(values) delete [] values;
由于我们在复制构造函数中,除非您在成员初始化列表中指定它们,否则没有任何成员已初始化。如果不是,如果它们是默认构造的,则它们是默认构造的,或者如果它们不是,则它们是不确定的。由于value
是一个指针,它的状态是不确定的,这意味着对它进行评估并删除它是未定义的行为。
答案 1 :(得分:2)
请记住,复制构造函数只是默认构造函数的构造函数。调用复制构造函数时,对象未初始化。
这意味着成员变量如M12=886
(我假设是成员变量)未初始化,其值将 indeterminate 。使用它时,您将有未定义的行为。