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

How to prevent SIGABRT from occuring when allocating an array of integers?

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

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

在您显示的代码段中,所缺少的只是在复制数据的循环之后的 delete[] temp;。但是这些错误很容易通过使用标准库容器(例如 std::vector)来避免,它们会为您完成所有这些工作。