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

Как правильно освобождать память в динамических структурах - C++

Восстановить пароль Регистрация
 
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
23.06.2012, 03:19     Как правильно освобождать память в динамических структурах #1
Использую деструктор для освобождения памяти от указателя на начало списка.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct Node
{
 int x;
 Node *Next;
};
 
class List
{
 Node *Head; //Указатель на начало списка
  public:
   List():Head(NULL) {};
   ~List();
};
 
List::~List()
{
  delete Head; //Освобождение
}
Вроде как список это и не массив, значит можно подумать, что достаточно удалить только один элемент (тот что указывает на начало списка)

Но видел, что в примерах используют циклы, полностью проходя по всем элементам списка как в массиве и каждый освобождая отдельно.

Мой вопрос: Как удалять правильно.


Еще вот что. При добавлении элементов в список сам указатель на начало списка я не трогаю и объявляю некоторую переменную, которая изначально расположена по адресу начала списка. Сначала меняю её, потом меняю адрес начала списа

C++
1
2
3
4
5
6
7
8
9
10
11
12
void List::Add(int x)
{
  Node temp=new Node;
   temp->Next=Head;
   temp->x=x;
 
   Head=temp; //Начало списка это последнее измененное поле структуры
   
   temp=NULL; 
   delete temp; //Освобождение памяти
   
}
Мой вопрос: Вообще всё это не способствует тому что данные какой-то другой программы ненароком попадут в те ячейки памяти, которые используется этим списком?

И интересует еще вопрос
в каких книгах подробно рассматриваются динамические структуры.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2012, 03:19     Как правильно освобождать память в динамических структурах
Посмотрите здесь:

C++ Обязательно ли освобождать память?
C++ Как правильно освободить память
Нужно ли освобождать память перед повторым выделением? C++
C++ Как правильно освобождать мютексы
C++ Как правильно освободить память
Как лучше копировать память, обмениваться указателями и т.д. при работе с кучей динамических библиотек (DLL) ? C++
C++ Зачем нужно освобождать память динамических объектов в деструкторе, если всё равно это сделает менеджер памяти
Нужно ли освобождать память от "sqlite3_column_blob" C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cppGhost
32 / 30 / 1
Регистрация: 21.06.2012
Сообщений: 91
23.06.2012, 05:19     Как правильно освобождать память в динамических структурах #2
Тут код списка, который правильно удаляет. Ты выделяешь элементы в куче, удалить только первый недостаточно. Функцию Add тоже там посмотри, как реализовано.

По поводу книжек могу посоветовать Скотт Мейерс
Эффективное использование STL. Но это может и не для начального уровня.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
23.06.2012, 11:55  [ТС]     Как правильно освобождать память в динамических структурах #3
Насколько я вижу, там реализация очереди и добавление элементов в очередь. А очередь это FIFO

У меня идет как LIFO, наверное должна быть разница в том как добавлять

Там в примере использован указатель на указатель, хотя вряд ли этого нельзя было избежать

Мне интересен вопрос не добавления, а освобождения памяти. В коде у меня правильно добавляется всё, просто если я выделяю паямть локально и сразу же локально высвобождаю то что выделил, возникает сомнение, описанное вторым вопросом



вот этим delete temp; //Освобождение памяти в функции Add, я лишаю связи программы с нужной кучей и туда могут попасть значения из других программ. Я правильно понял?
Yandex
Объявления
23.06.2012, 11:55     Как правильно освобождать память в динамических структурах
Ответ Создать тему
Опции темы

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