Почему С++ 11 позволяет использовать GC?

С++ 11 позволяет его реализациям выполнять (некоторые) утилиты сбора мусора. Почему стандарт допускает это? Мне всегда казалось, что на С++ вы не платите за то, что не используете. Для меня (неявный) GC чувствует, что это подрывает эту идеологию. Кроме того, нетрудно написать и использовать явную утилиту сбора мусора в С++ с помощью смарт-указателей.

Во-вторых, GC сделает некоторые другие действительные программы недействительными. Примеры включают маскирование указателя и связанные с ним низкоуровневые "хаки" указателя.

int * nums = new int[10];
nums += 2;
*nums = 777; // nothing points to the new'ed int[10] at this point
// oh no! nums could have gotten collected!!! (so lets assume it was)
*nums = 666; // crash (or memory corruption (or something else that bad))

Ответ 1

GC не обязательно должен существовать по стандарту С++ 11, но он может быть в будущих версиях.

Он не будет применяться к вам - он будет там, только если вы его попросите. Он не будет собирать ваши обычные указатели, он не будет собирать текущие интеллектуальные указатели. Таким образом, он по-прежнему "не использует - не плати за него". Он будет работать только на указателях, которые вы явно задаете, поэтому ваш пример будет работать так же, как сейчас.

См. Sutters Mill: Сводка коллекции мусора и С++

Частота ссылок (# 1) часто является лучшей и ее С++ по умолчанию формы GC. Но есть причины, чтобы (а не вместо этого) хотеть ленивых mark-sweep (# 2) сборка мусора на С++ для обработки вещей ref с учетом возможных проблем, в том числе, когда потенциальные циклы неизбежно (в некоторых случаях некоторые объекты, естественно, могут быть разделены, но затем могут ссылаться друг на друга) и проблемы с блокировкой ABA.

Под "подсчетом ссылок" Саттер ссылается на std::shared_ptr и другие подобные вещи.