Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> "мусор" в C++ 
:(
    Опции темы
makaka
Дата 30.10.2009, 04:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 25.10.2009

Репутация: нет
Всего: нет



программирую в Java - там вообще в принципе нет никаких вопросов по сборке мусора, т.е. ненужных более данных. Это делает автоматический сборщик мусора


Сейчас осваиваю С++. Собственно не понимаю - что автоматически удаляется, а что нет. Облазил уже много книг - не нашел.



Как я понимаю примитивные типы (int, float  и т.д.) удаляются автоматически из памяти когда заканчивается их область видимости. Их вручную удалять не надо.
А вот объект надо удалять вручную когда он перестает быть нужным, даже если программа переходит в ту часть, в которой объект перестает быть видимым (на него не остается ссылок). Правильно? 
Что тогда писать в деструкторе объекта? Какие поля нужно удалять "вручную" в деструкторе - все или примитивные не надо?

 Для контейнеров типа vector и map и других объектов из стандартной библиотеки нужно ли вызывать деструкторы после окончания использования???

Если программа (консоль) завершила работу удалит ли Windows автоматически то, что осталось в памяти после работы программы?



Какие еще есть особенности, связанные с освобождением памяти?



PS Вопросы видимо имеют тривиальный ответ, но в книгах на эту тему максимум 2 стр... А вопрос-то важный
PM MAIL   Вверх
IKM2007
Дата 30.10.2009, 04:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



Цитата(makaka @  30.10.2009,  04:17 Найти цитируемый пост)
Как я понимаю примитивные типы (int, float  и т.д.) удаляются автоматически из памяти когда заканчивается их область видимости. Их вручную удалять не надо.

Нет, для них написаны деструкторы, которые вызываются, когда нужно. Да и сам их не сможешь удалить. smile 
Цитата(makaka @  30.10.2009,  04:17 Найти цитируемый пост)
А вот объект надо удалять вручную когда он перестает быть нужным, даже если программа переходит в ту часть, в которой объект перестает быть видимым (на него не остается ссылок). Правильно? 

Да, иначе нельзя, если обьект будет невидимым, как ты его удалишь?
Цитата(makaka @  30.10.2009,  04:17 Найти цитируемый пост)
Какие поля нужно удалять "вручную" в деструкторе - все или примитивные не надо?

То есть "примитивные", это стандартные типы? Да, стандартные удалять не нужно, если конечно это не указатель. Типа:
Код

int *a;
a = new int [40];
...
delete a;

int **b = new int *[10];
for(int i = 0; i < 10; ++i)
b[i] = new int [10];

for(int i = 0; i < 10; ++i)
delete [] b[i];
delete [] b;

Цитата(makaka @  30.10.2009,  04:17 Найти цитируемый пост)
 Для контейнеров типа vector и map и других объектов из стандартной библиотеки нужно ли вызывать деструкторы после окончания использования???

Нет, опять таки если обьект не указатель.
Цитата(makaka @  30.10.2009,  04:17 Найти цитируемый пост)
Если программа (консоль) завершила работу удалит ли Windows автоматически то, что осталось в памяти после работы программы?

Да.


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
makaka
Дата 30.10.2009, 04:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 25.10.2009

Репутация: нет
Всего: нет



Спасибо!!!!!!

PS Все-таки сборщик мусора жизнь сильно упрощает =))
PM MAIL   Вверх
andrew_121
Дата 30.10.2009, 05:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(IKM2007 @  30.10.2009,  04:49 Найти цитируемый пост)
Нет, для них написаны деструкторы

Это же POD-ы

Цитата(IKM2007 @  30.10.2009,  04:49 Найти цитируемый пост)
Да, иначе нельзя

СтОит отметить, что у объектов бывают деструкторы(;)). Так же стОит отметить, что объекты могут создаваться на стэке, и при помощи оператора new

Добавлено через 2 минуты и 15 секунд
Цитата(makaka @  30.10.2009,  04:54 Найти цитируемый пост)
Все-таки сборщик мусора жизнь сильно упрощает

Конструкторы/деструкторы сильно упрощают жизнь, и защищают от ошибок при работе с памятью. Еще правильное проектирование проекта, чтоб минимизировать "ручное" управление памятью.

Добавлено через 2 минуты и 44 секунды
makaka, Да, и тему закрой.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
IKM2007
Дата 30.10.2009, 05:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



Цитата(andrew_121 @  30.10.2009,  05:00 Найти цитируемый пост)
Это же POD-ы

Да, действительно, нету деструкторов. 


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
Lazin
Дата 30.10.2009, 06:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



Цитата(andrew_121 @  30.10.2009,  05:00 Найти цитируемый пост)
Еще правильное проектирование проекта, чтоб минимизировать "ручное" управление памятью.
если есть сборщик мусора, то не нужно вообще думать о времени жизни объекта(в 99% случаев), а это очень сильно упрощает архитектуру, к тому-же, простота - не единственное преимущество сборщика мусора, перед "ручным" управлением памятью smile 
PM MAIL Skype GTalk   Вверх
jonie
Дата 30.10.2009, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Lazin, зато со сборщиком памяти есть другие проблемы: недетерменированное управление ресурсами (выкрутасы вроде наследования от IDispose), более прожорливая стратегия выделения памяти, чем это необходимо, менее быстрая программа в общем случае .... впрочем, чего я тебе рассказываю ) ты и так "в теме" )



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
maxim1000
Дата 30.10.2009, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



можно посмотреть в сторону boost::shared_ptr - если его использовать вместо простых указателей, он реализует "первое приближение" сборщика мусора


--------------------
qqq
PM WWW   Вверх
mes
Дата 30.10.2009, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(makaka @  30.10.2009,  03:17 Найти цитируемый пост)
Какие еще есть особенности, связанные с освобождением памяти?

Помойму приведенные ответы только запутали тс, имхо так проще :

  если вызвали new или new[] вызывайте delete или delete[] соответственно.. за исключением случаев, когда передали право удаления (почитайте в частности про умные указатели)
  особые случаи (например wx- и qt- объекты без проблем удаляются сами если у них определен родитель) описаны в документации к библиотеке.
  созданные  на стеке или статически удаляются сами, когда придет время
  деструктор на прямую вызывать не нужно


 





--------------------
PM MAIL WWW   Вверх
Lazin
Дата 30.10.2009, 11:53 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



Цитата(jonie @  30.10.2009,  08:58 Найти цитируемый пост)
Lazin, зато со сборщиком памяти есть другие проблемы: недетерменированное управление ресурсами (выкрутасы вроде наследования от IDispose), более прожорливая стратегия выделения памяти, чем это необходимо, менее быстрая программа в общем случае .... впрочем, чего я тебе рассказываю ) ты и так "в теме" )

позволь мне не согласиться с тобой, в общем случае(сферический случай в вакууме), GC в целом - быстрее, но зато время выполнения той или иной операции становится непредсказуемым, из-за GC
благодаря GC, операция выделения памяти имеет сложность O(1), освобождение памяти - в большинстве случаев то-же дешевая, чем меньше  живет объект - тем дешевле, помимо этого, фрагментация меньше, locality лучше(меньше кеш промахов)

Цитата(maxim1000 @  30.10.2009,  09:52 Найти цитируемый пост)
можно посмотреть в сторону boost::shared_ptr - если его использовать вместо простых указателей, он реализует "первое приближение" сборщика мусора
это никак не замена GC, к тому-же, это влечет за собой некоторые накладные расходы

Добавлено через 2 минуты и 35 секунд
выделение памяти в куче - оч. дорогая операция, а выделение памяти в управляемой сборщиком мусора куче - очень дешевая, сравнимая со стоимостью выделения памяти в стеке
PM MAIL Skype GTalk   Вверх
UnrealMan
Дата 30.10.2009, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 5
Всего: 32



Цитата(makaka @  30.10.2009,  04:17 Найти цитируемый пост)
Как я понимаю примитивные типы (int, float  и т.д.) удаляются автоматически из памяти когда заканчивается их область видимости. 

Типы удаляться не могут, удаляться могут объекты каких-то типов. Явным образом удалять объект, созданный через определение переменной, или временный объект не надо - это забота компилятора. Тип объекта никак не влияет на способ освобождения памяти, отводимой этому объекту изначально (размер которой можно получить через sizeof(T), где T - тип объекта), на это влияет только способ создания объекта.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1128 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.