Для лабораторного задания я работаю над реализацией массива кучи. У меня есть массив типа PrintJob *
. Проблема, с которой я сталкиваюсь, заключается в том, что первый элемент arr[0]
, который я пытаюсь удалить с помощью delete
, странным образом изменяет второй элемент массива. В конце концов этот элемент попадает в начало кучи, и удаление его вызывает SIGABRT.
Я изначально думал, что, возможно, удалив его из массива напрямую, delete arr[0]
выдавал какой-то тип ошибки, так как я неоднократно вызывал delete arr[0]
; несмотря на то, что я обновляю arr[0]
следующим его лучшим потомком сразу после его удаления. Итак, я попытался сохранить его во временной переменной, а затем удалить:
void dequeue() {
PrintJob *temp = arr[0];
//// delete arr[0];
trickleUp(0);
delete temp;
}
Но вскоре я понял, что мои усилия не имеют никакого смысла. Я знаю, что SIGABRT происходит, когда программа пытается удалить динамически размещенную сущность дважды, но я никогда не касаюсь каких-либо других элементов, кроме первого. Поэтому я не понимаю, почему второй элемент заполняется ненужными значениями, а затем выдает SIGABRT.
Вот другой код, который я использую:
Эта функция вызывается вышеуказанной функцией и управляет процессом смещения наибольшего потомка текущего индекса (n
) в его положение. Он делает это рекурсивно согласно требованию.
void trickleUp(int n) {
int c = getChild(n, true); // get the greater child
if (c >= MAX_HEAP_SIZE) { // if the
PrintJob *temp = arr[n];
//// delete arr[n];
arr[n] = nullptr;
delete temp;
return;
}
arr[n] = arr[c]; // update the old node
trickleUp(c); // move to the next element in the tree;
}
getChild () - это функция, вызываемая предыдущей функцией, предназначенная для возврата наибольшего дочернего индекса (ln
: левый узел, rn
: правый узел) текущего индекса n
.
int getChild(int n, bool g) {
int ln = (2 * n) + 1, rn = (2 * n) + 2, lp = -1, rp = -1;
if (ln < MAX_HEAP_SIZE && arr[ln]) {
lp = arr[ln]->getPriority();
}
if (rn < MAX_HEAP_SIZE && arr[rn]) {
rp = arr[rn]->getPriority();
}
return ( !((lp > rp) ^ g) ? ln:rn );
}
Я проверял код несколько раз, и я не видел никаких других логических ошибок, конечно, я не смогу точно сказать, пока эта проблема не будет решена, и я не смогу протестировать с дополнительными примерами , Вот ссылка на весь остальной код, если вы хотите скомпилировать его самостоятельно. Я тоже приложил make-файл.
https://drive.google.com/drive/folders/18idHtRO0Kuh_AftJgWj3K-4OGhbw4H7T?usp=sharing