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

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

Войти
Регистрация
Восстановить пароль
 
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,662
#1

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

23.06.2012, 03:19. Просмотров 961. Ответов 2
Метки нет (Все метки)

Использую деструктор для освобождения памяти от указателя на начало списка.

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++
Подскажите пожалуйста ,где память чистить в таком случае?Или как это правильно сделать. char *funk(.....){ char *name = new...

Как и когда правильно освобождать динамически выделенную память? - C++
Доброго времени суток! Задалась вопросом, заданным в заголовке темы "Как и когда правильно освобождать динамически выделенную...

Зачем нужно освобождать память динамических объектов в деструкторе, если всё равно это сделает менеджер памяти - C++
Не скажу за все ОС-и, но под Windows есть менеджер памяти. Когда по ходу кода встречается new, ну или что - то другое для алокации...

Как правильно освобождать мютексы - C++
Здравствуйте, у меня вопрос, есть разница в том как освобождать мютексы?? пример захватываем мютекс А, потом захватываем В ......

Где почитать о динамических структурах данных - C++
Дайте ссылку на книгу где доходчиво объясняются темы (С++) : 1.Динамические структуры данных 2.Односвязный и двусвязный список

Обязательно ли освобождать память? - C++
Обязательно ли освобождать память, если та область которая выделялась не использовалась в процессе работы программы? Просто, в такой...

Нужно ли освобождать память перед повторым выделением? - C++
к примеру мы имеем: char *itsString = new char; delete itsString; char *itsString = new char; Обязательно/желательно ли...

Как лучше копировать память, обмениваться указателями и т.д. при работе с кучей динамических библиотек (DLL) ? - C++
Привет! Вот есть много DLL-к, каждая работает со своей внутренней динамической памятью, а так же есть необходимость работать с объектами...

Нужно ли освобождать память от "sqlite3_column_blob" - C++
Достаю blob данные из SQLite3: int length = sqlite3_column_bytes(stmt,0); char* pData = new char; const char *pBuffer =...

Как правильно освободить память - C++
Здрасте! (Тема: Шаблоны функций.) Не могу правильно написать метод для освобождения памяти. В мейне делаю все необходимые мне...

Как правильно освободить память - C++
Написал вот такой костыль: wchar_t* getDate() { time_t seconds = time(NULL); tm timeinfo = *(localtime(&seconds)); return...

Как правильно освободить память - C++
Здравствуйте все! Подскажите, как правильно освобождать память, выделенную под массив оператором new? int *Arr = new int; ... delete...


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

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

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

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

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

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



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

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