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

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

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

Собственно в теме весь вопрос)
Непонятно, нужно ли вызывать delete для динамического объекта если его деструктор пустой так как все его члены принадлежат к автоматическому классу хранения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.09.2010, 15:04
Ответы с готовыми решениями:

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

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

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

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

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

17
fasked
Эксперт С++
4981 / 2560 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
21.09.2010, 15:15 #2
Цитата Сообщение от Stalk123 Посмотреть сообщение
Непонятно, нужно ли вызывать delete
delete нужно вызывать только для объектов, созданных с помощью new.
0
Stalk123
0 / 0 / 0
Регистрация: 07.09.2010
Сообщений: 25
21.09.2010, 16:12  [ТС] #3
Цитата Сообщение от fasked Посмотреть сообщение
delete нужно вызывать только для объектов, созданных с помощью new.
Объект создан динамически! НО зачем вызывать delete, если члены этого объекта находятся в автоматичесом хранилище, т.е. удаляются сами, и его деструктор пустой!
0
fasked
Эксперт С++
4981 / 2560 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
21.09.2010, 16:15 #4
Цитата Сообщение от Stalk123 Посмотреть сообщение
Объект создан динамически! НО зачем вызывать delete, если члены этого объекта находятся в автоматичесом хранилище, т.е. удаляются сами, и его деструктор пустой!
Данные объекта, память для которого выделена динамически, не удалятся пока не будет вызван delete. Это утечка памяти.
Я же сказал Вам - все что создали с помощью new должно быть удалено с помощью delete.
0
Evg
Эксперт CАвтор FAQ
19280 / 7136 / 529
Регистрация: 30.03.2009
Сообщений: 19,983
Записей в блоге: 30
21.09.2010, 16:23 #5
Цитата Сообщение от Stalk123 Посмотреть сообщение
Объект создан динамически! НО зачем вызывать delete, если члены этого объекта находятся в автоматичесом хранилище, т.е. удаляются сами, и его деструктор пустой!
Чтобы освободить память, которую сам объект занимает.
0
Stalk123
0 / 0 / 0
Регистрация: 07.09.2010
Сообщений: 25
21.09.2010, 16:28  [ТС] #6
я ничего не понял... т.е. что мне в деструкторе прописывать?? Удалять то нечего, получится пустой деструктор. А зачем тогда вызывать delete если она всего лишь неявно вызовет деструктор объекта и больше ничего, а деструктор у нас Пустой! Видимо я в чем-то заблуждаюсб но не пойму где
0
Evg
Эксперт CАвтор FAQ
19280 / 7136 / 529
Регистрация: 30.03.2009
Сообщений: 19,983
Записей в блоге: 30
21.09.2010, 16:30 #7
Stalk123, по ходу ты не очень понимаешь, что делает delete. Вот тут почитай http://www.cyberforum.ru/faq/thread130500.html
Вкратце суть в том, что delete делает две вещи: сначала вызывает деструктор, а потом освобождает память. Одна из стандартных ошибок начинающих
0
fasked
Эксперт С++
4981 / 2560 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
21.09.2010, 16:32 #8
Цитата Сообщение от Stalk123 Посмотреть сообщение
я ничего не понял... т.е. что мне в деструкторе прописывать?? Удалять то нечего, получится пустой деструктор. А зачем тогда вызывать delete если она всего лишь неявно вызовет деструктор объекта и больше ничего, а деструктор у нас Пустой! Видимо я в чем-то заблуждаюсб но не пойму где
delete не только вызывает деструктор, delete освобождает захваченную память. если этого не сделать, то занятая память не сможет повторно использоваться.
читайте книги.
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
21.09.2010, 16:33 #9
Stalk123, delete кроме вызова деструктора очищает память из под объекта, выделенную посредством вызова new. FAQ Конструкторы и деструкторы Вам в помощь.
0
Black Fregat
2460 / 1254 / 339
Регистрация: 31.05.2009
Сообщений: 4,921
21.09.2010, 18:00 #10
Цитата Сообщение от Stalk123 Посмотреть сообщение
Объект создан динамически! НО зачем вызывать delete, если члены этого объекта находятся в автоматичеком хранилище, т.е. удаляются сами, и его деструктор пустой!
1) Даже если на секунду предположить, что Ваш объект действительно как-то хитро не занимает места, delete надо вызывать из принципа. На каждый new - обязательный delete. Если каждый раз задумываться, типа "а вдруг в данном случае delete можно не вызывать" - откроем неисчерпаемый кладезь ошибок. Оно нам надо?

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

3) Чем спорить - взяли бы отладчик да сами посмотрели на утечки памяти
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
21.09.2010, 18:14 #11
Цитата Сообщение от Black Fregat Посмотреть сообщение
Даже если на секунду предположить, что Ваш объект действительно как-то хитро не занимает места, delete надо вызывать из принципа.
Могу добавить, что это невозможно. По стандарту объектов нулевого размера просто быть не может. Даже пустая структура:
C++
1
struct Foo {};
занимает один байт.
1
Evg
Эксперт CАвтор FAQ
19280 / 7136 / 529
Регистрация: 30.03.2009
Сообщений: 19,983
Записей в блоге: 30
21.09.2010, 18:17 #12
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Могу добавить, что это невозможно. По стандарту объектов нулевого размера просто быть не может. Даже пустая структура:
C++
1
struct Foo {};
занимает один байт.
Это нужно для того, чтобы для разных объектов this'ы имели разное значение. А это можно обеспечить только в том случае, если объект физически в памяти занимает ненулевое количество байт
2
Stalk123
0 / 0 / 0
Регистрация: 07.09.2010
Сообщений: 25
21.09.2010, 18:49  [ТС] #13
Цитата Сообщение от Black Fregat Посмотреть сообщение
3) Чем спорить - взяли бы отладчик да сами посмотрели на утечки памяти
Вот, есть простенький отлатчик чтобы за утечками следить под виндой?
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 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
Stalk123
0 / 0 / 0
Регистрация: 07.09.2010
Сообщений: 25
21.09.2010, 19:28  [ТС] #15
Так значит я понял что delete надо вызывать, если объект динамический, несмотря на его поля.
2) Получается, что автоматические члены динамического объекта располагаются тоже в динамической памяти, но удаляются сами?)
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
21.09.2010, 19:35 #16
Цитата Сообщение от Stalk123 Посмотреть сообщение
Получается, что автоматические члены динамического объекта располагаются тоже в динамической памяти, но удаляются сами?)
Грубо говоря, да, при вызове delete.
0
Stalk123
0 / 0 / 0
Регистрация: 07.09.2010
Сообщений: 25
21.09.2010, 19:42  [ТС] #17
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Грубо говоря, да, при вызове delete.
Что же спасибо. Буду экспериментировать с msvs. Кстати получилось находить утечки. Есть еще подобные полезные команды
?
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
21.09.2010, 19:46 #18
Цитата Сообщение от Stalk123 Посмотреть сообщение
Есть еще подобные полезные команды?
Смотря, что конкретно интресует. В любом случае, если собираетесь использовать MSVS, то обязательно подружитесь с MSDN - сэкономите кучу времени и нервов на поиске нужной информации.
0
21.09.2010, 19:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2010, 19:46

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

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

Проверка: Содержит ли хоть 1 итем листБокса в себе нужный элемент
Имеется текстбокс, в нем какой-то текс. Так же имеется листбокс в нем допустим...


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

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

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