分配整数数组时如何防止SIGABRT发生?

时间:2019-04-02 16:23:26

标签: c++ sigabrt

我正在通过添加和删除大量(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的数组时失败。

1 个答案:

答案 0 :(得分:2)

您永远不会释放用new分配的内存。因此,如果您的代码运行足够长的时间,最终将耗尽堆空间,这时进一步的分配将失败(如GDB所示)。

在您显示的摘录中,缺少的只是复制数据的循环之后的delete[] temp;。但是,使用标准库容器(例如std::vector)可以轻松避免这些错误,这些容器可以为您完成所有这些工作。