Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
#1

Двунаправленный связанный список, деструктор, утечка памяти - C++

27.08.2013, 15:04. Просмотров 790. Ответов 5
Метки нет (Все метки)

Делаю свой двунаправленный связанный список, основу взял от сюда (сам код, там 3 списка, во всех деструкторы одинаковые) - http://iguania.ru/stati-po-programmirovaniiu/svyazanniy-spisok.html

Там деструктор такой:
C++
1
2
MyList::~MyList()
{ delete head; }
Вопросы:
Но вроде как удаляется только голова, первый узел, а все остальные узлы остаются и тут как раз происходит утечка памяти, правильно я понимаю? Да и еще вопрос, это утечка, она распространяется только на время работы программы или же до того момента, пока я не перезагружу компьютер?

И что бы утечки памяти не было, нужно перебрать все узлы и удалить их, и деструктор должен иметь примерно такой вид:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
MyList::~MyList()
{ 
if (head == NULL) /* если список пуст */
{ delete head; } /* не знаю зачем удаляю нулевой указатель, но думаю это не повредит */
 
else /* если список не пуст, удаляем узел за узлом */
{
Node *temp = head;
Node *tempNext = temp->next;
 
while (temp->next != NULL)
{
delete temp;
temp = tempNext;
tempNext = temp->next;
}
 
delete temp; /* удаляем самый последний узел */
delete tempNext; /* и на всякий случай еще удаляем этот указатель */
}
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2013, 15:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Двунаправленный связанный список, деструктор, утечка памяти (C++):

Кольцевой, связанный, двунаправленный список - C++
Добрый вечер. Помогите, пожалуйста, написать код: Составить кольцевой, связанный, двунаправленный список для элементов: стол, шкаф. ...

Построить в динамической памяти линейный связанный список вещественного типа - C++
Всем привет! имеются 3 задачи на С++, надо срочно все написать и сдать. если есть чуток времени, очень прошу, помогите! заранее спасибо. ...

Построить в динамической памяти линейный связанный список строкового типа данных - C++
Задание: Построить в динамической памяти линейный связанный список строкового типа данных. Количество элементов списка заранее неизвестно....

Связанный список. Создать, записать в связный список последовательность слов,обозначающих месяцы года,заданных пользователем - C++
Создать связанный список.Кроме информационных полей он должен обязательно содержать указатели на предыдущий и следующий за ним...

Утечка памяти - C++
Взял листинг кода из книги Стивен Прата Язык программирования С++. Меня терзают смутные сомнения нет ли здесь утечки памяти, указатель ...

Утечка памяти - C++
В небольшой программе с использованием OpenCV происходит утечка памяти, с чем связана не понимаю, прошу помощи, спасибо! #include...

5
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
27.08.2013, 15:08 #2
Утечка только в пределах процесса, при завершении процесса память возвращается ОС.
А в чем вопрос? Примерно так должен выглядеть, примерно.
1
monolit
186 / 185 / 22
Регистрация: 24.03.2011
Сообщений: 669
Завершенные тесты: 1
27.08.2013, 15:15 #3
C++
1
2
3
4
5
while(head!=NULL) {
Node* tmp = head;
head = head->next;
delete tmp;
}
Так короче)
1
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
27.08.2013, 15:23  [ТС] #4
Герц, ну это скорее не вопрос, а проверка, все ли я правильно понимаю. Как говорится, доверяй, но проверяй.

monolit, за код спасибо, я этот деструктор несколько раз "укорачивал" и думал короче уже не куда, оказывается есть куда.
0
zer0mail
2378 / 2009 / 200
Регистрация: 03.07.2012
Сообщений: 7,248
Записей в блоге: 1
27.08.2013, 15:56 #5
Вообще-то в двунаправленном списке указатель на последный элемент не мешает обнулить (иначе он "подвиснет").
0
Убежденный
Ушел с форума
Эксперт С++
15708 / 7218 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
27.08.2013, 16:04 #6
Цитата Сообщение от VLK Посмотреть сообщение
не знаю зачем удаляю нулевой указатель, но думаю это не повредит
delete на нулевом указателе - это пустая операция. По стандарту.
Так что не повредит. Но лучше без нее, так как она лишняя (нечего удалять).

Цитата Сообщение от VLK Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
Node *temp = head;
Node *tempNext = temp->next;
while (temp->next != NULL)
{
delete temp;
temp = tempNext;
tempNext = temp->next;
}
delete temp; /* удаляем самый последний узел */
delete tempNext; /* и на всякий случай еще удаляем этот указатель */
Проще так:
C++
1
2
3
4
5
6
7
8
node *pNode = head;
 
while (NULL != pNode)
{
    node *pNext = pNode->next;
    delete pNode;
    pNode = pNext;
}
И не нужно ничего удалять "на всякий случай".
1
27.08.2013, 16:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2013, 16:04
Привет! Вот еще темы с ответами:

Утечка памяти - C++
Не могу понять как избежать утечки памяти в своей программе... привожу кусок в одном из мест где на мой взгляд она происходит... Array...

Утечка памяти - C++
Подскажите, где здесь может возникать утечка памяти? Вроде везде, где можно - чищу... ///////////////////////////////////// // It's...

Утечка памяти - C++
Здравствуйте. Есть программа (разбитая на функции) постоянно работающая в цикле и выводящая информацию на консоль. И получается что она...

Утечка памяти - C++
Помогите с кодом, вот написал реализацию стека по заданию. Преподаватель попросил проверить, верно ли я использую delete, ибо mas в классе...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.