0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 8
1

Использование деструктора в односвязном списке с++

06.05.2017, 14:17. Показов 1067. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Нужна срочная помощь!!!
Есть реализация односвязного списка в котором узел - класс, а не структура.
Вначале программы произвожу выделение памяти для списка:
C++
1
slist* sl = new slist();
Список заполняется объектами(эти объекты лежат в массиве) определенного класса в котором есть 2 поля(поля заполняются рандомом).
C++
1
2
3
4
5
6
 for(int i = 0; i<arrsize; i++)
        {
         nodarr[i] = new node();
         nodarr[i]->v = vampire(rand()%101,rand()%2);
         cout << nodarr[i]->v; (тут выводятся поля, оператор вывода перегружен)
        }
Далее происходит добавление в список :
C++
1
2
3
4
for(int i=0;i<arrsize;i++)
                {
                  sl->AddHead(*nodarr[i]);
                }
При повторном генерировании рандомных нодов и заполнении мне необходимо удалить все ноды(кроме головы) в списке и для этого я использую описанный деструктор.
C++
1
delete sl;
Проблема заключается в том, что на 3-ий раз генерации нодов(срабатывает второй раз
C++
1
delete sl;
) происходит ошибка , которую вызывает этот delete - returned 139(0x8B). Пытаюсь отладить, остановив брекпоинт на
C++
1
delete sl;
, но на второй раз оно даже не заходит внутрь инструкций
C++
1
delete sl;
.
Если попробовать выделать память каждый раз после удалении списка(вызова delete), то все работает. Но я не пойму почему без этого не работает , ведь в деструкторе я описал только удаление нодов, список я не удалял.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2017, 14:17
Ответы с готовыми решениями:

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

Стек на односвязном списке
#include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;malloc.h&gt; ...

Ошибка в односвязном списке
Помогите решить эти 2 проблемы C4101: NextNode: неиспользованная локальная переменная (в 118...

Ошибка в односвязном списке
Ошибка в функции вывод на экран информации содержащую список. Название функции Print. Ошибка: ...

5
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
06.05.2017, 14:29 2
kesyk, Очень сложно помогать при таком скудном описании. Кода нужно больше кода показывать, а в идеале, предоставить минимальный компилируемый пример, воспроизводящий ошибку.

В любом случае, если было сделано
C++
1
delete sl;
то обращаться к данным объекта, на который указывает sl уже нельзя. Память для него была освобождена. Т.е. именно, что тут удалился и объект списка, и узлы тоже, если в его деструкторе было описано их удаление.
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
06.05.2017, 14:30 3
мда, проблемный код, в котором всякие там delete вызываются вы посчитали не нужным приводить здесь? разумный ход.
0
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 8
06.05.2017, 16:17  [ТС] 4
Так в деструкторе я описал очищение только от узлов списка. Получается , что список все равно очищается полностью? Тогда как сделать,чтобы не было ошибки на этом месте? Законно ли в качестве решения повторно выделять память для списка, после того как удалили его?
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
06.05.2017, 16:24 5
ну раз сообщения вы не читаете, то вот решение конкретно вашей проблемы:

вы спрашиваете законно ли ...
да так можно. а можно ничего не делать. зачем удалять и потом создавать. эффективнее вообще ничего не делать.
результат будет тем же. в памяти что-то будет находится. но, вдобавок к этому вы получаете и решение проблемы
которая возникает у вас при некоторых вызовах delete. Итого:
вообще удалите из кода все delete
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
06.05.2017, 16:32 6
Цитата Сообщение от kesyk Посмотреть сообщение
Так в деструкторе я описал очищение только от узлов списка. Получается , что список все равно очищается полностью?
Деструктор вызывается при уничтожении объекта.
Может быть стоит повторить эти темы в своем учебнике, прежде чем продолжать?
0
06.05.2017, 16:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2017, 16:32
Помогаю со студенческими работами здесь

Ошибка в односвязном списке
#include&lt;iostream&gt; #include&lt;clocale&gt; using namespace std; #define DEBUG class Monom{...

Поиск в односвязном списке
Добрый всем день. Знаю что тема неоднократно поднималась. Помогите реализовать поиск по...

Указатели в односвязном списке
Хочу создать код , в котором пользователь заполняет данные по вопросам , и выводит их на экран ....

Remove_at() в односвязном списке
Привет. Не пойму как в данном(рабочем) коде, при удалении элемента посреди списка, предыдущему...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru