Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 07.09.2010
Сообщений: 25
1

Динамический объект не содержит в себе линамических членов. Удалять ли его?

21.09.2010, 15:04. Показов 1377. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Собственно в теме весь вопрос)
Непонятно, нужно ли вызывать delete для динамического объекта если его деструктор пустой так как все его члены принадлежат к автоматическому классу хранения.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.09.2010, 15:04
Ответы с готовыми решениями:

Описать тип "объект" содержит поля: вектор, его размер и его идентификатор в символьном виде
Тип "объект" содержит: - Поля: вектор, его размер и его идентификатор в символьном виде - Методы:...

При экспорте данных в pdf формате пишет: Убедитесь что объект существует и его имя не содержит ошибок?
Как исправить при экспорте данных в pdf формате пишет: Убедитесь что объект существует и его имя не...

MVVM. Если окно содержит 1 TabControl, который в себе содержит много вкладок и в каждой может быть другой TabControl с вкладками
Я сделал так: Создал UserControl, в него поместил TabControl создал вкладки, во вкладки начал...

Свойство содержит в себе массив
Здравствуйте, я только начинаю изучать ООП и вот застрял на этом: у меня есть класс в котором есть...

17
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
21.09.2010, 15:15 2
Цитата Сообщение от Stalk123 Посмотреть сообщение
Непонятно, нужно ли вызывать delete
delete нужно вызывать только для объектов, созданных с помощью new.
0
0 / 0 / 0
Регистрация: 07.09.2010
Сообщений: 25
21.09.2010, 16:12  [ТС] 3
Цитата Сообщение от fasked Посмотреть сообщение
delete нужно вызывать только для объектов, созданных с помощью new.
Объект создан динамически! НО зачем вызывать delete, если члены этого объекта находятся в автоматичесом хранилище, т.е. удаляются сами, и его деструктор пустой!
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
21.09.2010, 16:15 4
Цитата Сообщение от Stalk123 Посмотреть сообщение
Объект создан динамически! НО зачем вызывать delete, если члены этого объекта находятся в автоматичесом хранилище, т.е. удаляются сами, и его деструктор пустой!
Данные объекта, память для которого выделена динамически, не удалятся пока не будет вызван delete. Это утечка памяти.
Я же сказал Вам - все что создали с помощью new должно быть удалено с помощью delete.
0
Evg
Эксперт CАвтор FAQ
21280 / 8304 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
21.09.2010, 16:23 5
Цитата Сообщение от Stalk123 Посмотреть сообщение
Объект создан динамически! НО зачем вызывать delete, если члены этого объекта находятся в автоматичесом хранилище, т.е. удаляются сами, и его деструктор пустой!
Чтобы освободить память, которую сам объект занимает.
0
0 / 0 / 0
Регистрация: 07.09.2010
Сообщений: 25
21.09.2010, 16:28  [ТС] 6
я ничего не понял... т.е. что мне в деструкторе прописывать?? Удалять то нечего, получится пустой деструктор. А зачем тогда вызывать delete если она всего лишь неявно вызовет деструктор объекта и больше ничего, а деструктор у нас Пустой! Видимо я в чем-то заблуждаюсб но не пойму где
0
Evg
Эксперт CАвтор FAQ
21280 / 8304 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
21.09.2010, 16:30 7
Stalk123, по ходу ты не очень понимаешь, что делает delete. Вот тут почитай https://www.cyberforum.ru/faq/thread130500.html
Вкратце суть в том, что delete делает две вещи: сначала вызывает деструктор, а потом освобождает память. Одна из стандартных ошибок начинающих
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
21.09.2010, 16:32 8
Цитата Сообщение от Stalk123 Посмотреть сообщение
я ничего не понял... т.е. что мне в деструкторе прописывать?? Удалять то нечего, получится пустой деструктор. А зачем тогда вызывать delete если она всего лишь неявно вызовет деструктор объекта и больше ничего, а деструктор у нас Пустой! Видимо я в чем-то заблуждаюсб но не пойму где
delete не только вызывает деструктор, delete освобождает захваченную память. если этого не сделать, то занятая память не сможет повторно использоваться.
читайте книги.
0
Эксперт С++
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
21.09.2010, 16:33 9
Stalk123, delete кроме вызова деструктора очищает память из под объекта, выделенную посредством вызова new. FAQ Конструкторы и деструкторы Вам в помощь.
0
Фрилансер
3709 / 2082 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
21.09.2010, 18:00 10
Цитата Сообщение от Stalk123 Посмотреть сообщение
Объект создан динамически! НО зачем вызывать delete, если члены этого объекта находятся в автоматичеком хранилище, т.е. удаляются сами, и его деструктор пустой!
1) Даже если на секунду предположить, что Ваш объект действительно как-то хитро не занимает места, delete надо вызывать из принципа. На каждый new - обязательный delete. Если каждый раз задумываться, типа "а вдруг в данном случае delete можно не вызывать" - откроем неисчерпаемый кладезь ошибок. Оно нам надо?

2) Я не представляю, как члены объекта создаются в автоматическом хранилище. Объект создается вместе со своими членами. Плюс в нем вполне может создаваться всякая служебная информация.

3) Чем спорить - взяли бы отладчик да сами посмотрели на утечки памяти
0
Эксперт С++
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
21.09.2010, 18:14 11
Цитата Сообщение от Black Fregat Посмотреть сообщение
Даже если на секунду предположить, что Ваш объект действительно как-то хитро не занимает места, delete надо вызывать из принципа.
Могу добавить, что это невозможно. По стандарту объектов нулевого размера просто быть не может. Даже пустая структура:
C++
1
struct Foo {};
занимает один байт.
1
Evg
Эксперт CАвтор FAQ
21280 / 8304 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
21.09.2010, 18:17 12
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Могу добавить, что это невозможно. По стандарту объектов нулевого размера просто быть не может. Даже пустая структура:
C++
1
struct Foo {};
занимает один байт.
Это нужно для того, чтобы для разных объектов this'ы имели разное значение. А это можно обеспечить только в том случае, если объект физически в памяти занимает ненулевое количество байт
2
0 / 0 / 0
Регистрация: 07.09.2010
Сообщений: 25
21.09.2010, 18:49  [ТС] 13
Цитата Сообщение от Black Fregat Посмотреть сообщение
3) Чем спорить - взяли бы отладчик да сами посмотрели на утечки памяти
Вот, есть простенький отлатчик чтобы за утечками следить под виндой?
0
Эксперт С++
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
21.09.2010, 19:15 14
Цитата Сообщение от Stalk123 Посмотреть сообщение
Вот, есть простенький отлатчик чтобы за утечками следить под виндой?
Если используете MSVS, то достаточно подключить <crtdbg.h> и вставить строку:
C++
1
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
в начале main или WinMain.
По завершении работы программы в Output Window будут выведена информация об утечках, если таковые будут.
1
0 / 0 / 0
Регистрация: 07.09.2010
Сообщений: 25
21.09.2010, 19:28  [ТС] 15
Так значит я понял что delete надо вызывать, если объект динамический, несмотря на его поля.
2) Получается, что автоматические члены динамического объекта располагаются тоже в динамической памяти, но удаляются сами?)
0
Эксперт С++
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
21.09.2010, 19:35 16
Цитата Сообщение от Stalk123 Посмотреть сообщение
Получается, что автоматические члены динамического объекта располагаются тоже в динамической памяти, но удаляются сами?)
Грубо говоря, да, при вызове delete.
0
0 / 0 / 0
Регистрация: 07.09.2010
Сообщений: 25
21.09.2010, 19:42  [ТС] 17
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Грубо говоря, да, при вызове delete.
Что же спасибо. Буду экспериментировать с msvs. Кстати получилось находить утечки. Есть еще подобные полезные команды
?
0
Эксперт С++
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
21.09.2010, 19:46 18
Цитата Сообщение от Stalk123 Посмотреть сообщение
Есть еще подобные полезные команды?
Смотря, что конкретно интресует. В любом случае, если собираетесь использовать MSVS, то обязательно подружитесь с MSDN - сэкономите кучу времени и нервов на поиске нужной информации.
0
21.09.2010, 19:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.09.2010, 19:46
Помогаю со студенческими работами здесь

Когда надо удалять объект
Если объект создаётся по ссылке оператором new, его надо удалять. А если он создаётся внутри...

Браузер FireFox содержит в себе вирусы
Доброго времени суток дорогие форумчане! Решил установить себе на пк браузер FireFox, и ради...

Как удалять объект Graphics::TBitmap
подскажите пож.как удалять объект Graphics::TBitmap *,в одних книгах написано что builder сам...

Как проверить, содержит ли Rt поле в себе линку
Как проверить, содержит ли rt поле в себе ссылку на другой док-т? пасибо!

Что содержит в себе массив Char *p[max]
char *p я не могу понять...то ли он из символов,то ли из их кодов,то ли ещё из чего-то... =-O

Вывести Popup, который содержит в себе материал статьи
Добрый день! Столкнулся со сложностью: Главная страница сайта - плиточный дизайн, с выводом...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru