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

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

Войти
Регистрация
Восстановить пароль
 
ВиталикБВГ
11 / 10 / 3
Регистрация: 29.11.2009
Сообщений: 186
#1

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

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

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

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

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

Вопрос о динамическом выделении памяти для строки - C++
Как можно реализовать динамическое выделение для строки, т.е. например у меян есть указатель - char *c. Мне необходимо ввести строку с...

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

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

Ошибка при динамическом выделении памяти - C++
Я не понимаю почему, но почему-то пример по динамическому выделению памяти, взятый с этой веб-страницы: http://cppstudio.com/post/9555/...

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

Создание исключения при динамическом выделении памяти - C++
Вот код из учебника в нем мне все понятно. #include<iostream> #include<cstdlib> //exit() #include<new> using std::cout;using...

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

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

Добавлено через 12 минут
как в K&R2 написано про malloc() и free():
при первом вызове malloc() с помощью системного вызова, обращаясь к системе, запрашивает большой кусок памяти, отрезает от него часть и возвращает указатель на начало (оставшуюся часть добавляет в список свободной памяти), при последующих вызовах, она от этого же куска отрезает ещё часть и возвращает указатель на начало (оставшуюся часть добавляет в список свободной памяти); когда этого куска не хвататает, malloc() делает снова запрос к операционной системе, и добавляет ещё один большой кусок к первому куску (добавляет его в список свободной памяти)
free() возвращает отрезанный кусок в список свободных кусков (если нужно, склеивает соседние свободные узлы списка в один узел), malloc() потом может выбрать любой узел подходящего размера (разделит его, конечно, точно)
1
20.04.2010, 09:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2010, 09:40
Привет! Вот еще темы с ответами:

Выравнивание при динамическом выделении памяти под массив - C++
Добрый вечер. Для того, чтобы выделить память под массив динамически и выровнять указатель по 16 байтам, в разных ОС существуют разные...

Cin.getline() не работает при динамическом выделении памяти - C++
Почему в таком коде cin.getline() работает не так как надо? Если очистить поток, то будет все нормально. #include <iostream> using...

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

Ошибка при динамическом выделении двумерного массива char - C++
Ребята, спасите-помогите. Нужно выделить двумерный массив типа char для игрового поля. Выделяю вроде бы как положено, но получаю рантайм...


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

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

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