Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > "мусор" в C++


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


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



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

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

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



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



PS Вопросы видимо имеют тривиальный ответ, но в книгах на эту тему максимум 2 стр... А вопрос-то важный

Автор: IKM2007 30.10.2009, 04:49
Цитата(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 автоматически то, что осталось в памяти после работы программы?

Да.

Автор: makaka 30.10.2009, 04:54
Спасибо!!!!!!

PS Все-таки сборщик мусора жизнь сильно упрощает =))

Автор: andrew_121 30.10.2009, 05:00
Цитата(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, Да, и тему закрой.

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

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

Автор: Lazin 30.10.2009, 06:35
Цитата(andrew_121 @  30.10.2009,  05:00 Найти цитируемый пост)
Еще правильное проектирование проекта, чтоб минимизировать "ручное" управление памятью.
если есть сборщик мусора, то не нужно вообще думать о времени жизни объекта(в 99% случаев), а это очень сильно упрощает архитектуру, к тому-же, простота - не единственное преимущество сборщика мусора, перед "ручным" управлением памятью smile 

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

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

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

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

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


 



Автор: Lazin 30.10.2009, 11:53
Цитата(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 секунд
выделение памяти в куче - оч. дорогая операция, а выделение памяти в управляемой сборщиком мусора куче - очень дешевая, сравнимая со стоимостью выделения памяти в стеке

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

Типы удаляться не могут, удаляться могут объекты каких-то типов. Явным образом удалять объект, созданный через определение переменной, или временный объект не надо - это забота компилятора. Тип объекта никак не влияет на способ освобождения памяти, отводимой этому объекту изначально (размер которой можно получить через sizeof(T), где T - тип объекта), на это влияет только способ создания объекта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)