Создание очереди в C++ - что такое ошибка malloc?

Я создаю простую очередь, но получаю странную ошибку:

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;
};

Есть ли причина, по которой вы не используете std::queue вместо того, чтобы раскатывать свой собственный вручную? В любом случае вы не инициализируете head нулевым перед его использованием, поэтому у вас есть узлы с недопустимыми значениями next.

Remy Lebeau 23.10.2018 17:34

Похоже, что среда выполнения сообщает вам точную проблему. Я имею в виду ошибка для объекта 0x7f9c61c00340: освобождаемый указатель не был выделен, почему я упоминаю об этом, вы не всегда получаете такое подробное сообщение об ошибке.

drescherjm 23.10.2018 17:34

Скомпилируйте со всеми предупреждениями и отладочной информацией: g++ -Wall -Wextra -g с GCC. Прочтите как отлаживать небольшие программы. Используйте Valgrind

Basile Starynkevitch 23.10.2018 17:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
164
1

Ответы 1

Вы делаете: node<int> *head;, а затем ставите его в очередь с nn->next = n;

В результате сохраняется неинициализированная память, а затем происходит сбой при удалении.

Попробуйте node<int> *head = NULL;

Есть ли особая причина использовать NULL вместо nullptr?

Michiel uit het Broek 23.10.2018 17:50

Вероятно, потому что код в вопросе использует вместо этого NULL.

drescherjm 23.10.2018 17:57

он печатает одно и то же число (13) для каждого удаления из очереди. однако он удалил ошибку

MontgommeryJR 24.10.2018 00:56

Другие вопросы по теме