Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Зеленый1
2 / 2 / 2
Регистрация: 21.04.2011
Сообщений: 100
1

Корректно ли освобождение выделенной памяти?

20.10.2011, 18:31. Просмотров 769. Ответов 7
Метки нет (Все метки)

Извиняюсь, если такой вопрос уже звучал. Допустим есть такой кусок кода:
C++
1
2
3
4
5
6
7
8
9
struct A
{
int *x;
} *b;
void main()
{
b = new A;
b->x = new int[10];
}
Как мне после завершения работы корректно освободить выделенную память? Сойдет ли просто
C++
1
delete b
или необходимо предварительно освободить память, которую занимает поле x?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.10.2011, 18:31
Ответы с готовыми решениями:

Освобождение выделенной памяти
Здравствуйте! Есть структура, выглядит, например, так: struct some_structure { int* s; } ...

Массив: Освобождение выделенной памяти
Сказали переделать код, нужно что бы память освобождалась не в отдельной функции а как то по...

Освобождение памяти, выделенной через new
Я прочитал, что память динамически для строки, можно выделить к примеру узнать длину строки...

Освобождение памяти, выделенной под массив
Выделяю память под массив: int (*array_1) = new int; как освободить то, что выделил? ...

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

7
amor1k
Студент
148 / 148 / 64
Регистрация: 18.01.2011
Сообщений: 469
20.10.2011, 18:55 2
ну если освобождаешь х, то "delete b->x". А если всю структуру, то наверно же "delete b"
0
Зеленый1
2 / 2 / 2
Регистрация: 21.04.2011
Сообщений: 100
20.10.2011, 19:02  [ТС] 3
я имел ввиду, что если написать "delete b", то память, занимаемая полем х, освободится или останется "висеть" в оператиной памяти. Мы же для нее как бы отдельно память выделяем, поэтому наверно отдельно надо и освободить, но может я ошибаюсь?
0
Kastaneda
Jesus loves me
Эксперт С++
4940 / 3017 / 346
Регистрация: 12.12.2009
Сообщений: 7,612
Записей в блоге: 2
Завершенные тесты: 1
20.10.2011, 20:19 4
Цитата Сообщение от Зеленый1 Посмотреть сообщение
я имел ввиду, что если написать "delete b", то память, занимаемая полем х, освободится или останется "висеть" в оператиной памяти
Память, выделенная под x, останется неосвобожденной.
1
Зеленый1
2 / 2 / 2
Регистрация: 21.04.2011
Сообщений: 100
20.10.2011, 20:33  [ТС] 5
Kastaneda, благодарю! А если например у меня A - это не структура, а класс, в котором есть метод, который выделяет память для x. При вызове деструктора этого класса память также останется неосвобожденной?
0
rangerx
1942 / 1551 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
20.10.2011, 20:43 6
Зеленый1, каждому вызову new должен соответствовать вызов delete(в том или ином виде). Никаким другим способом, во время работы программы, динамически выделенная память не освобождается.
1
Bers
Заблокирован
20.10.2011, 20:45 7
Цитата Сообщение от Зеленый1 Посмотреть сообщение
При вызове деструктора этого класса память также останется неосвобожденной?
Если в диструкторе класса вы пропишите код, который будит освобождать все захваченные ресурсы - тогда освободится. Если оставите пустой диструктор - будит утечка памяти.

Принцип тут простой - явно выделяли память на куче, явно освобождайте.
И ещё есть золотое правило: кто выделял, тот и освобождает.

Так то обычно, класс под свои нужды выделяет память в конструкторе, а освобождает в диструкторе.
1
Kastaneda
Jesus loves me
Эксперт С++
4940 / 3017 / 346
Регистрация: 12.12.2009
Сообщений: 7,612
Записей в блоге: 2
Завершенные тесты: 1
20.10.2011, 20:46 8
Цитата Сообщение от Зеленый1 Посмотреть сообщение
А если например у меня A - это не структура, а класс, в котором есть метод, который выделяет память для x. При вызове деструктора этого класса память также останется неосвобожденной?
Если в деструкторе пропишешь delete []x;, то все будет в порядке)

Добавлено через 27 секунд
опоздал...
1
20.10.2011, 20:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2011, 20:46

Освобождение памяти, выделенной на динамический массив структур
Есть динамический массив структур. Как я понимаю, delete A не производит полной очистки памяти в...

Объясните правила работы с delete с указателями и массивами (корректное освобождение выделенной памяти)
Указатель содержал ссылку на динамический массив. Массив удалил. Имеет ли смысл применять delete на...

Косвенное обращение к методам. Освобождение памяти,выделенной под двумерный динамический массив
Вопрос 1. В задании необходимо проиллюстрировать косвенный способ обращения к методам. Искал в...


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

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

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