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

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

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

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

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

Делаю свой двунаправленный связанный список, основу взял от сюда (сам код, там 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++
Всем привет! имеются 3 задачи на С++, надо срочно все написать и сдать. если есть чуток времени, очень прошу, помогите! заранее спасибо. ...

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

Утечка памяти - C++
Здравствуйте! Я пишу длинную арифметику для целых чисел. Ниже - функция произведения чисел X и Y. Вопрос: произойдет ли утечка памяти, и...

Утечка памяти? - C++
В Лафоре такой код: #include <iostream> using namespace std; /////////////////////////////////////////////////////////// class...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
27.08.2013, 15:08     Двунаправленный связанный список, деструктор, утечка памяти #2
Утечка только в пределах процесса, при завершении процесса память возвращается ОС.
А в чем вопрос? Примерно так должен выглядеть, примерно.
monolit
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 667
Завершенные тесты: 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
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
27.08.2013, 15:23  [ТС]     Двунаправленный связанный список, деструктор, утечка памяти #4
Герц, ну это скорее не вопрос, а проверка, все ли я правильно понимаю. Как говорится, доверяй, но проверяй.

monolit, за код спасибо, я этот деструктор несколько раз "укорачивал" и думал короче уже не куда, оказывается есть куда.
zer0mail
2330 / 1956 / 192
Регистрация: 03.07.2012
Сообщений: 7,013
Записей в блоге: 1
27.08.2013, 15:56     Двунаправленный связанный список, деструктор, утечка памяти #5
Вообще-то в двунаправленном списке указатель на последный элемент не мешает обнулить (иначе он "подвиснет").
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2013, 16:04     Двунаправленный связанный список, деструктор, утечка памяти
Еще ссылки по теме:

Утечка памяти - C++
#include "stdafx.h" #include <iostream> #include "ArrayOperation.h" using namespace std; int main() { int...

Утечка памяти - C++
Где я допустил ее(утечку)? #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstring> #include <string> class...

Утечка памяти - C++
Господа подскажите как узнать какая п̶а̶д̶л̶а̶ переменная жрет память? Или как посмотреть сколько вообще переменных и объектов находятся в...

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

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

Утечка памяти - C++
Доброго времени суток, форумчане. Помогите справиться с утечкой памяти, не понятно где зараза засела. Это класс представления числа в СОК...


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

Или воспользуйтесь поиском по форуму:
Убежденный
Системный программист
Эксперт С++
15298 / 6930 / 1096
Регистрация: 02.05.2013
Сообщений: 11,340
Завершенные тесты: 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     Двунаправленный связанный список, деструктор, утечка памяти
Ответ Создать тему
Опции темы

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