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

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

Войти
Регистрация
Восстановить пароль
 
Зеленый1
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 100
#1

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

20.10.2011, 18:31. Просмотров 747. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Корректно ли освобождение выделенной памяти? (C++):

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

Освобождение памяти, выделенной через new - C++
Я прочитал, что память динамически для строки, можно выделить к примеру узнать длину строки strlen(tex) и нужно добавить единицу для...

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

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

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

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

7
amor1k
Студент
148 / 148 / 24
Регистрация: 18.01.2011
Сообщений: 469
20.10.2011, 18:55 #2
ну если освобождаешь х, то "delete b->x". А если всю структуру, то наверно же "delete b"
0
Зеленый1
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 100
20.10.2011, 19:02  [ТС] #3
я имел ввиду, что если написать "delete b", то память, занимаемая полем х, освободится или останется "висеть" в оператиной памяти. Мы же для нее как бы отдельно память выделяем, поэтому наверно отдельно надо и освободить, но может я ошибаюсь?
0
Kastaneda
Jesus loves me
Эксперт С++
4755 / 2959 / 243
Регистрация: 12.12.2009
Сообщений: 7,514
Записей в блоге: 2
Завершенные тесты: 1
20.10.2011, 20:19 #4
Цитата Сообщение от Зеленый1 Посмотреть сообщение
я имел ввиду, что если написать "delete b", то память, занимаемая полем х, освободится или останется "висеть" в оператиной памяти
Память, выделенная под x, останется неосвобожденной.
1
Зеленый1
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 100
20.10.2011, 20:33  [ТС] #5
Kastaneda, благодарю! А если например у меня A - это не структура, а класс, в котором есть метод, который выделяет память для x. При вызове деструктора этого класса память также останется неосвобожденной?
0
rangerx
1941 / 1550 / 141
Регистрация: 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
Эксперт С++
4755 / 2959 / 243
Регистрация: 12.12.2009
Сообщений: 7,514
Записей в блоге: 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
Привет! Вот еще темы с ответами:

Косвенное обращение к методам. Освобождение памяти,выделенной под двумерный динамический массив - C++
Вопрос 1. В задании необходимо проиллюстрировать косвенный способ обращения к методам. Искал в интернете. Нашел : Array *s, obj(n,...

резервирование памяти/освобождение памяти для трехмерного массива - C++
Необходимо создать трехмерный массив (A), в котором элементы вдоль направления Z выли бы выровнены по 16 байт. Есть две проблемы: ...

Освобождение памяти - C++
Добрый день. Пишу в рубрику "Вопросы начинающих по С/С++" посему вопрос глупый :) И все же, есть такой код //offset - массив...

Освобождение памяти - C++
#include<iostream> #include<cstring> using namespace std; struct stringy{ char * str; int ct; }; stringy & set(stringy &...


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

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

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