| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > "мусор" в C++ |
| Автор: makaka 30.10.2009, 04:17 |
| программирую в Java - там вообще в принципе нет никаких вопросов по сборке мусора, т.е. ненужных более данных. Это делает автоматический сборщик мусора Сейчас осваиваю С++. Собственно не понимаю - что автоматически удаляется, а что нет. Облазил уже много книг - не нашел. Как я понимаю примитивные типы (int, float и т.д.) удаляются автоматически из памяти когда заканчивается их область видимости. Их вручную удалять не надо. А вот объект надо удалять вручную когда он перестает быть нужным, даже если программа переходит в ту часть, в которой объект перестает быть видимым (на него не остается ссылок). Правильно? Что тогда писать в деструкторе объекта? Какие поля нужно удалять "вручную" в деструкторе - все или примитивные не надо? Для контейнеров типа vector и map и других объектов из стандартной библиотеки нужно ли вызывать деструкторы после окончания использования??? Если программа (консоль) завершила работу удалит ли Windows автоматически то, что осталось в памяти после работы программы? Какие еще есть особенности, связанные с освобождением памяти? PS Вопросы видимо имеют тривиальный ответ, но в книгах на эту тему максимум 2 стр... А вопрос-то важный |
| Автор: makaka 30.10.2009, 04:54 |
| Спасибо!!!!!! PS Все-таки сборщик мусора жизнь сильно упрощает =)) |
| Автор: andrew_121 30.10.2009, 05:00 |
Это же POD-ы СтОит отметить, что у объектов бывают деструкторы(;)). Так же стОит отметить, что объекты могут создаваться на стэке, и при помощи оператора new Добавлено через 2 минуты и 15 секунд Конструкторы/деструкторы сильно упрощают жизнь, и защищают от ошибок при работе с памятью. Еще правильное проектирование проекта, чтоб минимизировать "ручное" управление памятью. Добавлено через 2 минуты и 44 секунды makaka, Да, и тему закрой. |
| Автор: IKM2007 30.10.2009, 05:10 |
Да, действительно, нету деструкторов. |
| Автор: Lazin 30.10.2009, 06:35 | ||
|
| Автор: jonie 30.10.2009, 08:58 |
| Lazin, зато со сборщиком памяти есть другие проблемы: недетерменированное управление ресурсами (выкрутасы вроде наследования от IDispose), более прожорливая стратегия выделения памяти, чем это необходимо, менее быстрая программа в общем случае .... впрочем, чего я тебе рассказываю ) ты и так "в теме" ) |
| Автор: maxim1000 30.10.2009, 09:52 |
| можно посмотреть в сторону boost::shared_ptr - если его использовать вместо простых указателей, он реализует "первое приближение" сборщика мусора |
| Автор: mes 30.10.2009, 09:53 |
Помойму приведенные ответы только запутали тс, имхо так проще : если вызвали new или new[] вызывайте delete или delete[] соответственно.. за исключением случаев, когда передали право удаления (почитайте в частности про умные указатели) особые случаи (например wx- и qt- объекты без проблем удаляются сами если у них определен родитель) описаны в документации к библиотеке. созданные на стеке или статически удаляются сами, когда придет время деструктор на прямую вызывать не нужно |
| Автор: Lazin 30.10.2009, 11:53 | ||||
позволь мне не согласиться с тобой, в общем случае(сферический случай в вакууме), GC в целом - быстрее, но зато время выполнения той или иной операции становится непредсказуемым, из-за GC благодаря GC, операция выделения памяти имеет сложность O(1), освобождение памяти - в большинстве случаев то-же дешевая, чем меньше живет объект - тем дешевле, помимо этого, фрагментация меньше, locality лучше(меньше кеш промахов)
Добавлено через 2 минуты и 35 секунд выделение памяти в куче - оч. дорогая операция, а выделение памяти в управляемой сборщиком мусора куче - очень дешевая, сравнимая со стоимостью выделения памяти в стеке |
| Автор: UnrealMan 30.10.2009, 18:04 | ||
Типы удаляться не могут, удаляться могут объекты каких-то типов. Явным образом удалять объект, созданный через определение переменной, или временный объект не надо - это забота компилятора. Тип объекта никак не влияет на способ освобождения памяти, отводимой этому объекту изначально (размер которой можно получить через sizeof(T), где T - тип объекта), на это влияет только способ создания объекта. |