Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
12 / 11 / 0
Регистрация: 29.11.2009
Сообщений: 186
1

Вопрос о динамическом выделении памяти

19.04.2010, 17:36. Просмотров 548. Ответов 4
Метки нет (Все метки)

Доброго времени суток всем. у меня вопрос к работе следующего кода:

delete[] values; // Удаляем массив из кучи
values = temp; // присваиваем адресу адрес нового массива(он тоже в куче находится)
temp = 0; // Сбрасываем указатель на массив,который находится в куче

мне вот что кажется неестественным:
-когда мы удаляем массив из кучи почему на него остаётся указатель?(мы ему присваиваем значение указателя на другой массив)
-когда мы присваиваем указателю temp ноль - ведь мы по сути приводим этим к утечке памяти? поскольку массив так и находится в куче,а указатель на него мы сбросили - мы к нему теперь не можем обратиться,а память он занимает? или я не правильно что-то понимаю?
заранее благодарю за ответы.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.04.2010, 17:36
Ответы с готовыми решениями:

Вопрос о динамическом выделении памяти для строки
Как можно реализовать динамическое выделение для строки, т.е. например у меян есть указатель - char...

Ошибка на динамическом выделении памяти
программа ниже безупречно выполнялась под С++Builder 6.0 (консольное приложение). При переводе ее...

Немного о динамическом выделении памяти ...
объявление данных в классе: class Employee {.......... private: char *firstName;...

Ошибка при динамическом выделении памяти
Я не понимаю почему, но почему-то пример по динамическому выделению памяти, взятый с этой...

4
1663 / 1132 / 80
Регистрация: 21.08.2008
Сообщений: 4,725
Записей в блоге: 1
19.04.2010, 17:40 2
Цитата Сообщение от ВиталикБВГ Посмотреть сообщение
-когда мы удаляем массив из кучи почему на него остаётся указатель?
память помечается как свободная, но не очищается

Цитата Сообщение от ВиталикБВГ Посмотреть сообщение
-когда мы присваиваем указателю temp ноль - ведь мы по сути приводим этим к утечке памяти?
если где то сохранили адрес памяти до присвоения 0, то всегда можно будет по этому адресу отыскать блок памяти и корректно его удалить, к утечкам это не приведет
1
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
19.04.2010, 17:58 3
int *p = new int[10];
int mas[123];
p = 0 или p = mas; // утечка, обратится не можем, удалить не можем, будет занимать память, пока не выйдем из процесса.
1
12 / 11 / 0
Регистрация: 29.11.2009
Сообщений: 186
20.04.2010, 08:56  [ТС] 4
память помечается как свободная, но не очищается
А правильно я понимаю: область памяти становится доступной для перезаписи,но пока мы не запишем туда новое значение , в ней остаются те же значения и указатель на начало этих значений - т е на массив? т е функция delete просто разрешает перезаписать эту память в случае нужды?
0
4849 / 3270 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
20.04.2010, 09:40 5
смысл delete в том, чтобы сделать память снова доступной для new

Добавлено через 12 минут
как в K&R2 написано про malloc() и free():
при первом вызове malloc() с помощью системного вызова, обращаясь к системе, запрашивает большой кусок памяти, отрезает от него часть и возвращает указатель на начало (оставшуюся часть добавляет в список свободной памяти), при последующих вызовах, она от этого же куска отрезает ещё часть и возвращает указатель на начало (оставшуюся часть добавляет в список свободной памяти); когда этого куска не хвататает, malloc() делает снова запрос к операционной системе, и добавляет ещё один большой кусок к первому куску (добавляет его в список свободной памяти)
free() возвращает отрезанный кусок в список свободных кусков (если нужно, склеивает соседние свободные узлы списка в один узел), malloc() потом может выбрать любой узел подходящего размера (разделит его, конечно, точно)
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.04.2010, 09:40

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Ошибка при динамическом выделении памяти
почему у меня возникет ошибка вот тут struct TOVAR *New = new struct TOVAR; пишит недопустимый...

Выдаёт ошибку при динамическом выделении памяти
В строчке cout << "Значение по адресу " << p << " равно: " << *p << endl; ...

Создание исключения при динамическом выделении памяти
Вот код из учебника в нем мне все понятно. #include<iostream> #include<cstdlib> //exit()...

Cin.getline() не работает при динамическом выделении памяти
Почему в таком коде cin.getline() работает не так как надо? Если очистить поток, то будет все...

Выравнивание при динамическом выделении памяти под массив
Добрый вечер. Для того, чтобы выделить память под массив динамически и выровнять указатель по 16...

Использование конструктора базового класса при динамическом выделении памяти
Есть базовый класс, от него наследуются несколько классов, свой конструктор я определил в базовом...


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

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

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