我正在通过添加和删除大量(50k)随机元素来测试堆的非常基本的实现。但是,在发生SIGABRT时,我再也没有删除元素。
我试图用零初始化一个整数数组,但这没有帮助。
int Heap::pop() {
if (size == 0) {
std::cerr << "The heap is empty.\n";
return 0;
}
if(size == 1){
int key = heap[0];
heap = new int[0];
size = 0;
return key;
}
else {
int key = heap[0];
int *temp;
temp = heap;
temp[0] = temp[size - 1];
heap = new int[size - 1]; //GDB marks this line
for (int i = 0; i < size - 1; i++)
heap[i] = temp[i];
heapifyDown(0);
size--;
return key;
}
}
似乎要初始化大小为49992的数组时失败。
答案 0 :(得分:2)
您永远不会释放用new
分配的内存。因此,如果您的代码运行足够长的时间,最终将耗尽堆空间,这时进一步的分配将失败(如GDB所示)。
在您显示的摘录中,缺少的只是复制数据的循环之后的delete[] temp;
。但是,使用标准库容器(例如std::vector
)可以轻松避免这些错误,这些容器可以为您完成所有这些工作。