分配整数数组时如何防止发生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
)来避免,它们会为您完成所有这些工作。
我正在通过添加和删除大量 (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
)来避免,它们会为您完成所有这些工作。