Ошибка в очистке памяти

Рейтинг: -4Ответов: 1Опубликовано: 08.03.2023

Появляется ошибка при очистке head в delStack(), и я не понимаю в чем проблема.

#include <iostream>
#include <vector>
#include <string>
using namespace std;

typedef struct {
    string name;
    int amount;
}Data;

struct Node {
    Data info;
    Node* next;
};

Node* head;

Node* addStack(Data add) {
    Node* p;
    p = new Node[sizeof(Node)];
    if (p) {
        p->info = add;
        p->next = head;
        head = p;

    }
    return p;
}

void printStack() {
    struct Node* p;
    cout << "======================\n";
    p = head;
    while (p != NULL) {
        cout << p->info.name << "\t" << p->info.amount << endl;
        p = p->next;
    }
}

void delStack() {
    Node* p;
    p = head->next;
    free(head);
    head = p;
}

int main() {
    
    Data s;
    head = NULL;
    for (int i = 0; i < 5; i++)
    {
        cin >> s.name;
        cin >> s.amount;
        if (!addStack(s)) {
            cout << "Error of adding element in stack" << endl;
            break;
        }
    }
    printStack();
    delStack();

}

Ответы

▲ 1Принят

У вас такая ядреная смесь французского (С++) с нижегородским (С), что проще исправить код и попросить вас разобраться, почему он исправлен именно так...

Одно смешение new и free, а равно неверное применение new чего стоит.

Кстати, код получился далеко не лучший, но тут я был ограничен вашей, так сказать, парадигмой.

#include <iostream>
#include <string>
using namespace std;

struct Data
{
    string name;
    int amount;
};

struct Node
{
    Data info;
    Node* next;
};

Node* head;

Node* addStack(const Data& add)
{
    Node* p = new Node;
    p->info = add;
    p->next = head;
    head = p;
    return p;
}

void printStack()
{
    Node* p = head;
    cout << "======================\n";
    while (p != nullptr)
    {
        cout << p->info.name << "\t" << p->info.amount << endl;
        p = p->next;
    }
}

void delStack(Node* p = head)
{
    if (p == nullptr) return;
    delStack(p->next);
    delete p;
}

int main() {
    
    Data s;
    head = NULL;
    for (int i = 0; i < 5; i++)
    {
        cin >> s.name;
        cin >> s.amount;
        if (!addStack(s)) {
            cout << "Error of adding element in stack" << endl;
            break;
        }
    }
    printStack();
    delStack();

}