Как предотвратить возникновение SIGABRT при выделении массива целых чисел? - PullRequest
1 голос
/ 02 апреля 2019

Я тестирую очень простую реализацию кучи, добавляя и удаляя множество (50 тыс.) Случайных элементов. Однако я никогда не удаляю элементы, так как происходит 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 Ответ

2 голосов
/ 02 апреля 2019

Вы никогда не освобождаете память, выделенную для new. Следовательно, в конечном итоге вам не хватит места в куче, если ваш код выполняется достаточно долго, и в этот момент дальнейшее распределение завершится неудачно (как показывает GDB).

В показанном вами фрагменте все, что отсутствует, это delete[] temp; после цикла, который копирует данные. Но этих ошибок легко избежать, используя стандартные контейнеры библиотеки (такие как std::vector), которые делают все это за вас.

...