Я постоянно слышу, как люди жалуются, что в C ++ нет сборки мусора.
Мне их очень жаль. Серьезно.
В C ++ есть RAII, и я всегда жалуюсь, что не нашел RAII (или кастрированного RAII) в языках Сборка мусора.
Какие преимущества может предложить сборщик мусора опытному разработчику C ++?
Еще один инструмент.
Мэтт J написал это совершенно правильно в своем посте ( Сборка мусора в C ++ - почему? ): нам не нужны функции C ++, так как большинство из них могут быть написаны на C, и мы не не нужны функции C, так как большинство из них могут быть закодированы в Assembly и т. д. C ++ должен развиваться.
Как разработчик: мне наплевать на GC. Я попробовал оба RAII и GC, и я считаю RAII значительно лучше. Как сказал Грег Роджерс в своем посте ( Сборка мусора в C ++ - почему? ), утечки памяти не так страшны (по крайней мере, в C ++, где они редки, если C ++ действительно используется), чтобы оправдать GC вместо RAII. GC имеет недетерминированное освобождение / завершение и является просто способом написать код, который просто не заботится о конкретных вариантах памяти .
Это последнее предложение важно: важно написать код, который "позаботится о том, что все равно". Точно так же в C ++ RAII мы не заботимся об освобождении ресурсов, потому что RAII делает это за нас, или об инициализации объектов, потому что конструктор делает это за нас, иногда важно просто написать код, не заботясь о том, кто является владельцем какой памяти, и какой указатель (общий, слабый и т. д.) нам нужен для того или иного куска кода. Кажется, в C ++ требуется GC. (даже если я лично не вижу его)
Пример хорошего использования GC в C ++
Иногда в приложении появляются «плавающие данные». Представьте себе древовидную структуру данных, но на самом деле никто не является «владельцем» данных (и никто не заботится о том, когда именно они будут уничтожены). Несколько объектов могут использовать его, а затем отказаться от него. Вы хотите, чтобы он был освобожден, когда никто больше его не использует.
Подход C ++ использует умный указатель. На ум приходит повышение :: shared_ptr. Таким образом, каждый фрагмент данных принадлежит своему собственному общему указателю. Здорово. Проблема в том, что когда каждый кусок данных может ссылаться на другой кусок данных. Вы не можете использовать общие указатели, потому что они используют счетчик ссылок, который не будет поддерживать циклические ссылки (A указывает на B, а B указывает на A). Так что вы должны знать, много думать о том, где использовать слабые указатели (boost :: weak_ptr) и когда использовать общие указатели.
С помощью GC вы просто используете древовидные данные.
Недостатком является то, что вас не должно волновать , когда «плавающие данные» действительно будут уничтожены. Только то, что оно будет уничтожено.
Заключение
В итоге, если все сделано правильно и совместимо с текущими идиомами C ++, GC станет еще одним хорошим инструментом для C ++ .
C ++ - это мультипарадигмальный язык: добавление GC, возможно, заставит некоторых фанатов C ++ плакать из-за измены, но, в конце концов, это может быть хорошей идеей, и я предполагаю, что Комитет по стандартам C ++ не допустит такого рода Функция нарушает язык, поэтому мы можем доверять им работу, необходимую для включения корректного GC C ++, который не будет мешать C ++: Как всегда в C ++, если вам не нужна функция, не используйте это и вам ничего не будет стоить.