Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
Stalk123
0 / 0 / 0
Регистрация: 07.09.2010
Сообщений: 25
#1

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

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

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

C++ Динамический глобальный объект.
Создать динамический массив, заполнить его и вывести C++
C++ Создать динамический массив и вывести его на экран
C++ где размещается массив и как его правильно удалять?
C++ функция возвращающая аргументу его значение сама по себе
C++ Динамический объект класса и деструктор
C++ Создайте класс employee, который содержит имя (объект класса string) и номер (типа long) служащего
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4929 / 2509 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
21.09.2010, 15:15     Динамический объект не содержит в себе линамических членов. Удалять ли его? #2
Цитата Сообщение от Stalk123 Посмотреть сообщение
Непонятно, нужно ли вызывать delete
delete нужно вызывать только для объектов, созданных с помощью new.
Stalk123
0 / 0 / 0
Регистрация: 07.09.2010
Сообщений: 25
21.09.2010, 16:12  [ТС]     Динамический объект не содержит в себе линамических членов. Удалять ли его? #3
Цитата Сообщение от fasked Посмотреть сообщение
delete нужно вызывать только для объектов, созданных с помощью new.
Объект создан динамически! НО зачем вызывать delete, если члены этого объекта находятся в автоматичесом хранилище, т.е. удаляются сами, и его деструктор пустой!
fasked
Эксперт C++
 Аватар для fasked
4929 / 2509 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
21.09.2010, 16:15     Динамический объект не содержит в себе линамических членов. Удалять ли его? #4
Цитата Сообщение от Stalk123 Посмотреть сообщение
Объект создан динамически! НО зачем вызывать delete, если члены этого объекта находятся в автоматичесом хранилище, т.е. удаляются сами, и его деструктор пустой!
Данные объекта, память для которого выделена динамически, не удалятся пока не будет вызван delete. Это утечка памяти.
Я же сказал Вам - все что создали с помощью new должно быть удалено с помощью delete.
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17023 / 5428 / 336
Регистрация: 30.03.2009
Сообщений: 14,694
Записей в блоге: 26
21.09.2010, 16:23     Динамический объект не содержит в себе линамических членов. Удалять ли его? #5
Цитата Сообщение от Stalk123 Посмотреть сообщение
Объект создан динамически! НО зачем вызывать delete, если члены этого объекта находятся в автоматичесом хранилище, т.е. удаляются сами, и его деструктор пустой!
Чтобы освободить память, которую сам объект занимает.
Stalk123
0 / 0 / 0
Регистрация: 07.09.2010
Сообщений: 25
21.09.2010, 16:28  [ТС]     Динамический объект не содержит в себе линамических членов. Удалять ли его? #6
я ничего не понял... т.е. что мне в деструкторе прописывать?? Удалять то нечего, получится пустой деструктор. А зачем тогда вызывать delete если она всего лишь неявно вызовет деструктор объекта и больше ничего, а деструктор у нас Пустой! Видимо я в чем-то заблуждаюсб но не пойму где
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17023 / 5428 / 336
Регистрация: 30.03.2009
Сообщений: 14,694
Записей в блоге: 26
21.09.2010, 16:30     Динамический объект не содержит в себе линамических членов. Удалять ли его? #7
Stalk123, по ходу ты не очень понимаешь, что делает delete. Вот тут почитай http://www.cyberforum.ru/faq/thread130500.html
Вкратце суть в том, что delete делает две вещи: сначала вызывает деструктор, а потом освобождает память. Одна из стандартных ошибок начинающих
fasked
Эксперт C++
 Аватар для fasked
4929 / 2509 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
21.09.2010, 16:32     Динамический объект не содержит в себе линамических членов. Удалять ли его? #8
Цитата Сообщение от Stalk123 Посмотреть сообщение
я ничего не понял... т.е. что мне в деструкторе прописывать?? Удалять то нечего, получится пустой деструктор. А зачем тогда вызывать delete если она всего лишь неявно вызовет деструктор объекта и больше ничего, а деструктор у нас Пустой! Видимо я в чем-то заблуждаюсб но не пойму где
delete не только вызывает деструктор, delete освобождает захваченную память. если этого не сделать, то занятая память не сможет повторно использоваться.
читайте книги.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2297 / 1667 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
21.09.2010, 16:33     Динамический объект не содержит в себе линамических членов. Удалять ли его? #9
Stalk123, delete кроме вызова деструктора очищает память из под объекта, выделенную посредством вызова new. FAQ Конструкторы и деструкторы Вам в помощь.
Black Fregat
 Аватар для Black Fregat
1354 / 984 / 215
Регистрация: 31.05.2009
Сообщений: 4,108
21.09.2010, 18:00     Динамический объект не содержит в себе линамических членов. Удалять ли его? #10
Цитата Сообщение от Stalk123 Посмотреть сообщение
Объект создан динамически! НО зачем вызывать delete, если члены этого объекта находятся в автоматичеком хранилище, т.е. удаляются сами, и его деструктор пустой!
1) Даже если на секунду предположить, что Ваш объект действительно как-то хитро не занимает места, delete надо вызывать из принципа. На каждый new - обязательный delete. Если каждый раз задумываться, типа "а вдруг в данном случае delete можно не вызывать" - откроем неисчерпаемый кладезь ошибок. Оно нам надо?

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

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

Динамический массив string и его вывод C++
C++ Создать динамический двумерный массив и заполнить его
Динамический массив new и его структура выделения памяти? C++
C++ "Объект содержит не соответствующие квалификаторы типа"
Динамический объект класса C++

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

Или воспользуйтесь поиском по форуму:
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2297 / 1667 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
21.09.2010, 19:46     Динамический объект не содержит в себе линамических членов. Удалять ли его? #18
Цитата Сообщение от Stalk123 Посмотреть сообщение
Есть еще подобные полезные команды?
Смотря, что конкретно интресует. В любом случае, если собираетесь использовать MSVS, то обязательно подружитесь с MSDN - сэкономите кучу времени и нервов на поиске нужной информации.
Yandex
Объявления
21.09.2010, 19:46     Динамический объект не содержит в себе линамических членов. Удалять ли его?
Ответ Создать тему
Опции темы

Текущее время: 11:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru