Я создаю простую очередь, но получаю странную ошибку:
compile (46096,0x7fffb263d380) malloc: * ошибка объекта 0x7f9c61c00340: освобождаемый указатель не был выделен * устанавливает точку останова в malloc_error_break для отладки
Если я уменьшу количество методов постановки в очередь, я получу ошибку сегментации.
Мой основной класс:
#include <iostream>
#include "queue.h"
using namespace std;
template <typename ItemType>
void enqueue(const ItemType &i, node<ItemType>* &n, const long &p) {
node<ItemType> *nn = new node<ItemType>;
nn->item = i;
nn->next = n;
n = nn;
}
template <typename ItemType>
ItemType dequeue(node<ItemType>* &n) {
ItemType fr;
node<ItemType> *ptr;
ptr=n;
n = n->next;
while(ptr->next != NULL){
ptr = ptr->next;
}
fr = ptr->item;
delete ptr;
return fr;
}
int main() {
node<int> *head;
enqueue(13,head, 1);
enqueue(10,head, 2);
enqueue(18,head, 3);
cout<<head->item<<"\t"<<head->next->item<<"\t"<<head->next->next->item<<endl;
cout<<dequeue(head)<<"\t";
cout<<dequeue(head)<<"\t";
cout<<dequeue(head)<<endl;
//cout<<dequeue(head)<<endl; // create error cathcing
}
Класс-оболочка моего узла:
#include <iostream>
template <typename ItemType>
struct node {
ItemType item;
node<ItemType> *next;
int priority;
};
Похоже, что среда выполнения сообщает вам точную проблему. Я имею в виду ошибка для объекта 0x7f9c61c00340: освобождаемый указатель не был выделен, почему я упоминаю об этом, вы не всегда получаете такое подробное сообщение об ошибке.
Скомпилируйте со всеми предупреждениями и отладочной информацией: g++ -Wall -Wextra -g с GCC. Прочтите как отлаживать небольшие программы. Используйте Valgrind





Вы делаете: node<int> *head;, а затем ставите его в очередь с nn->next = n;
В результате сохраняется неинициализированная память, а затем происходит сбой при удалении.
Попробуйте node<int> *head = NULL;
Есть ли особая причина использовать NULL вместо nullptr?
Вероятно, потому что код в вопросе использует вместо этого NULL.
он печатает одно и то же число (13) для каждого удаления из очереди. однако он удалил ошибку
Есть ли причина, по которой вы не используете
std::queueвместо того, чтобы раскатывать свой собственный вручную? В любом случае вы не инициализируетеheadнулевым перед его использованием, поэтому у вас есть узлы с недопустимыми значениямиnext.