1 / 1 / 0
Регистрация: 21.02.2016
Сообщений: 41
1

Какую память освобождать в деструкторе?

17.09.2017, 14:54. Показов 1939. Ответов 6

Студворк — интернет-сервис помощи студентам
Если я вызываю деконструктор класса, допустим чтобы освободить динамическую память, выделенную с помощью new или malloc, то память, выделенная под остальные атрибуты, будет освобождена?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2017, 14:54
Ответы с готовыми решениями:

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

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

Как правильно освобождать память
Подскажите пожалуйста ,где память чистить в таком случае?Или как это правильно сделать. char...

Как правильно освобождать память от вектора?
ПОжалуйста если можно пример для одномерного и двумерного. циклом или метод есть какой то?

6
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
17.09.2017, 15:15 2
все не так просто, как вы описали. но возмжно вы имели в виду не вызов деструктора, а вызов чего-нить типа
delete someObjPtr;

Вызов же деструктора например someObjPtr->~SomeObjPtr() не освобождает память, на которую указывает someObjPtr.
Вызов деструктора приводит к вызовам деструкторов мемберов.
Вызов деструктора != освобождение памяти.
0
nd2
3434 / 2813 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
17.09.2017, 19:06 3
Цитата Сообщение от Навин Посмотреть сообщение
Если я вызываю деконструктор класса
В общих случаях не требуется явный вызов деструктора, он вызовется автоматически при окончании жизни объекта.
Цитата Сообщение от Навин Посмотреть сообщение
чтобы освободить динамическую память, выделенную с помощью new или malloc, то память, выделенная под остальные атрибуты, будет освобождена?
Всё, что должен сдеалать явный деструктор, должно быть в нём прописано. Насчёт освобождения памяти: то, что выделялось, тобой, через new (malloc), должно освобождаться через delete (free), остальное - не твоя забота.
0
1 / 1 / 0
Регистрация: 21.02.2016
Сообщений: 41
17.09.2017, 19:09  [ТС] 4
DU3, я имел ввиду если явно прописать деструктор. К примеру так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class My_class
{
    int a;
    int A[100];
    int *p;
public:
    My_class()
    {
        p = new int[100];
    }
    ~My_class()
    {
        delete[] p;
    }
};
В этом случае, когда вызовется деконструктор, память, выделенная под a и A освободиться? Как я понимаю, то если она будет в сегменте стека, то, соответственно, при выходе из операторных скобок, освободиться, но если мы создавали объект через new и удаляем через delete, то тогда что? Память под a и A освободится вместе с p?
0
nd2
3434 / 2813 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
17.09.2017, 19:12 5
Цитата Сообщение от Навин Посмотреть сообщение
В этом случае, когда вызовется деконструктор, память, выделенная под a и A освободиться?
Освободится.
Цитата Сообщение от nd2 Посмотреть сообщение
то, что выделялось, тобой, через new (malloc), должно освобождаться через delete (free), остальное - не твоя забота.
1
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
17.09.2017, 19:21 6
Лучший ответ Сообщение было отмечено Навин как решение

Решение

ну если до букв докапываться, то от вызова деструктора память выделенная под a, A и p не освободится.
например как работает оператор delete, который нельзя переопределить:
он вызывает деструктор для объекта и потом освобождает память, выделенную под этот объект. т.е. память освобождается за пределами вызова деструктора. поэтому, если вы удаляете объект через delete, то можете рассчитывать на то, что нужное вам освобождение произойдет. в случае стека история похожая. деструктор вызовится ну а потом стек подправится нужным образом. но есть и другие случаи, когда деструктор приходится явно вызывать. у вас который?
1
1 / 1 / 0
Регистрация: 21.02.2016
Сообщений: 41
18.09.2017, 16:37  [ТС] 7
DU3, все, спасибо большое, разобрался
0
18.09.2017, 16:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.09.2017, 16:37
Помогаю со студенческими работами здесь

Как правильно освобождать память в динамических структурах
Использую деструктор для освобождения памяти от указателя на начало списка. struct Node { int...

Нужно ли освобождать память перед повторым выделением?
к примеру мы имеем: char *itsString = new char; delete itsString; char *itsString = new char;...

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

И снова динамическая память, malloc и free в конструкторе и деструкторе
Короче есть, класс, который например хранит строку, я его храню в структуре, после я выдиляю...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru