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

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

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

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

23.06.2012, 03:19. Просмотров 1002. Ответов 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; //Освобождение памяти
   
}
Мой вопрос: Вообще всё это не способствует тому что данные какой-то другой программы ненароком попадут в те ячейки памяти, которые используется этим списком?

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

Как правильно освобождать память - C++
Подскажите пожалуйста ,где память чистить в таком случае?Или как это правильно сделать. char *funk(.....){ char *name = new...

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

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

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

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

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

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

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

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

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

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



вот этим delete temp; //Освобождение памяти в функции Add, я лишаю связи программы с нужной кучей и туда могут попасть значения из других программ. Я правильно понял?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2012, 11:55
Привет! Вот еще темы с ответами:

Нужно ли освобождать память перед повторым выделением? - 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++
Есть функция char* md5(const char*). Как освободить память выделенную ею? #include <openssl\md5.h> char* md5(const char* text) { ...


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

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

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