数据结构中的双重释放或损坏
double free or corruption in data structures
我在下面有代码,我在其中实现了堆队列。
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
这样的成员变量(我假设它是一个成员变量)没有初始化,并且它的值将是不确定的。当您使用它时,您将具有未定义的行为。
相关文章:
- C++双重释放或损坏(out)
- 使用全局声明的向量时,C++双重释放错误/损坏
- 在矢量中使用擦除时双重释放或损坏(快速顶部).如何擦除一个矢量的几个项目知道它们的索引?
- 双重释放或损坏(输出)和中止(核心转储)错误
- 赋值运算符上的双重释放或损坏(out)
- 双重释放或损坏(快速顶部).我该如何解决?
- 双重释放或损坏错误(找不到错误?
- 使用unique_ptr和继承时双重释放或损坏
- 对于我的类函数,我得到双重释放或损坏错误
- 双重释放或损坏(输出):使用向量的组合算法0x0000000001a880a0***
- 如何找到写入释放的内存(堆损坏)?
- OpenMP *** "..."中的错误:双重释放或损坏(快速顶部):[地址] ***
- 动态数组的双重释放或损坏
- 在 wcsncpy 之后释放字符串会导致堆损坏
- 数据结构中的双重释放或损坏
- 错误: *** 检测到 glibc *** w5:双重释放或损坏(快速顶部):
- 在递归函数中释放内存时堆损坏
- 双重释放或损坏(如果重新排序行,则运行正常)
- 双重释放或损坏 (!prev) C++ OpenCV
- C++ 异常的双重释放损坏错误(复制构造函数不起作用)