Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
27.08.2013, 15:04     Двунаправленный связанный список, деструктор, утечка памяти #1
Делаю свой двунаправленный связанный список, основу взял от сюда (сам код, там 3 списка, во всех деструкторы одинаковые) - http://iguania.ru/stati-po-programmi...iy-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; /* и на всякий случай еще удаляем этот указатель */
}
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2013, 15:04     Двунаправленный связанный список, деструктор, утечка памяти
Посмотрите здесь:

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

monolit, за код спасибо, я этот деструктор несколько раз "укорачивал" и думал короче уже не куда, оказывается есть куда.
zer0mail
2184 / 1867 / 187
Регистрация: 03.07.2012
Сообщений: 6,635
Записей в блоге: 1
27.08.2013, 15:56     Двунаправленный связанный список, деструктор, утечка памяти #5
Вообще-то в двунаправленном списке указатель на последный элемент не мешает обнулить (иначе он "подвиснет").
Убежденный
Системный программист
 Аватар для Убежденный
14188 / 6203 / 984
Регистрация: 02.05.2013
Сообщений: 10,331
Завершенные тесты: 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;
}
И не нужно ничего удалять "на всякий случай".
Yandex
Объявления
27.08.2013, 16:04     Двунаправленный связанный список, деструктор, утечка памяти
Ответ Создать тему
Опции темы

Текущее время: 13:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru