Сравнение двух подходов к управлению памятью |
Перед разработкой сборщика мусора для С++ полезно сравнить сбор мусора с методом распределения памяти вручную, встроенным в С++. Обычно использование динамической памяти в С++ — двухэтапный процесс. Сначала память выделяется из хип-области с помощью операции new. Затем, когда она больше не нужна, память освобождается с помощью операции delete. Таким образом, каждое динамическое распределение выполняется в следующей последовательности: Р = new some_object; II ... delete р; Как правило, любое применение операции new должно быть уравновешено соответствующим вызовом операции delete. Если delete не применяется, то память не освобождается, даже если она уже не используется в программе. Ключевое отличие сбора мусора от управления памятью вручную заключается в том, что он автоматизирует очистку неиспользуемой памяти. Следовательно, сбор мусора превращает распределение памяти в одношаговую операцию. Например, в языках Java и С# память выделяется для использования с помощью new, но никогда явно не освобождается в программе. Вместо этого периодически запускается сборщик мусора для поиска фрагментов памяти, на которые не указывает ни один объект. Если на какой-либо участок памяти не ссылается ни один объект, — это означает, что данная область памяти в программе не используется, и сборщик мусора, обнаружив такой фрагмент, освобождает его. Таким образом, в системе сбора мусора нет операции delete, да она и не нужна. На первый взгляд, простота, свойственная процессу сбора мусора, может показаться очевидным аргументом в пользу этого способа управления динамической памятью. Действительно возникает вопрос: почему же метод управления памятью вручную до сих пор используется, да еще и в таком мощном языке, как С++? Однако в случае динамического распределения первые впечатления оказываются обманчивыми, потому что оба подхода не лишены ряда недостатков. И только приложением определяется, какой способ подходит более. В следующих разделах приведены некоторые соображения на этот счет.
|