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