Ошибка сегментации при попытке удалить связанный список - PullRequest
0 голосов
/ 30 сентября 2019

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

Вместо этого я взял код из моего деструктора и затем поместил его в функцию-член с именем purge(), которая не выдает никаких ошибок. Почему это так? Что-то в корне не так с моим классом?

  #include <iostream>
struct LList
{
    LList *p , *s;
    int data;
    LList (LList *prev , LList *succ, int n) : p{prev} , s{succ} , data{n}{}
    ~LList()
    {

        auto start = this;
        while (start->p ) start = start->p;
        while(1)
        {
            auto temp = start;
            start = start->s;
            delete temp;
            if (start == nullptr) break;
        }
        std::cout << "Destruted!";
    }
    void traverse() const
    {
        auto start = this;
        while (start->p != nullptr)start = start->p;
        while (1)
        {
        std::cout << start->data;
        if (start->s == nullptr) break;
        else start = start->s;
        }
    }
};
int main()
{
    LList *natural = new LList{nullptr , nullptr , 1};
    natural = new LList{natural, nullptr , 2};
    natural->p->s = natural;
    natural = new LList{natural, nullptr , 5};
    natural->p->s = natural;
    natural->traverse();
    std::cout << natural->data;
    natural->~LList();
}

Версия с продувкой:

#include <iostream>
struct LList
{
   ....
    void purge()
    {

        auto start = this;
        while (start->p ) start = start->p;
        while(1)
        {
            auto temp = start;
            start = start->s;
            delete temp;
            if (start == nullptr) break;
        }
        std::cout << "Destruted!";
    }
    void traverse() const
    {
        auto start = this;
....
int main()
{
    ...
    natural->purge();
}

ps: Даже чистка помогает? Я все еще могу пойти:

natural->purge();
    std::cout << natural->data;
}

к концу, и это вывело бы 125Disrupted!5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...