Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Навин
1 / 1 / 0
Регистрация: 21.02.2016
Сообщений: 33
1

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

17.09.2017, 14:54. Просмотров 888. Ответов 6

Если я вызываю деконструктор класса, допустим чтобы освободить динамическую память, выделенную с помощью new или malloc, то память, выделенная под остальные атрибуты, будет освобождена?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2017, 14:54
Ответы с готовыми решениями:

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

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

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

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

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

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

Вызов же деструктора например someObjPtr->~SomeObjPtr() не освобождает память, на которую указывает someObjPtr.
Вызов деструктора приводит к вызовам деструкторов мемберов.
Вызов деструктора != освобождение памяти.
0
nd2
2838 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
17.09.2017, 19:06 3
Цитата Сообщение от Навин Посмотреть сообщение
Если я вызываю деконструктор класса
В общих случаях не требуется явный вызов деструктора, он вызовется автоматически при окончании жизни объекта.
Цитата Сообщение от Навин Посмотреть сообщение
чтобы освободить динамическую память, выделенную с помощью new или malloc, то память, выделенная под остальные атрибуты, будет освобождена?
Всё, что должен сдеалать явный деструктор, должно быть в нём прописано. Насчёт освобождения памяти: то, что выделялось, тобой, через new (malloc), должно освобождаться через delete (free), остальное - не твоя забота.
0
Навин
1 / 1 / 0
Регистрация: 21.02.2016
Сообщений: 33
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
2838 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
17.09.2017, 19:12 5
Цитата Сообщение от Навин Посмотреть сообщение
В этом случае, когда вызовется деконструктор, память, выделенная под a и A освободиться?
Освободится.
Цитата Сообщение от nd2 Посмотреть сообщение
то, что выделялось, тобой, через new (malloc), должно освобождаться через delete (free), остальное - не твоя забота.
1
DU3
281 / 233 / 115
Регистрация: 07.09.2016
Сообщений: 587
17.09.2017, 19:21 6
Лучший ответ Сообщение было отмечено Навин как решение

Решение

ну если до букв докапываться, то от вызова деструктора память выделенная под a, A и p не освободится.
например как работает оператор delete, который нельзя переопределить:
он вызывает деструктор для объекта и потом освобождает память, выделенную под этот объект. т.е. память освобождается за пределами вызова деструктора. поэтому, если вы удаляете объект через delete, то можете рассчитывать на то, что нужное вам освобождение произойдет. в случае стека история похожая. деструктор вызовится ну а потом стек подправится нужным образом. но есть и другие случаи, когда деструктор приходится явно вызывать. у вас который?
1
Навин
1 / 1 / 0
Регистрация: 21.02.2016
Сообщений: 33
18.09.2017, 16:37  [ТС] 7
DU3, все, спасибо большое, разобрался
0
18.09.2017, 16:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2017, 16:37

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

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

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


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

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

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