Они НЕ являются взаимоисключающими. Не стесняйтесь использовать C ++ с libgc (сборщик Boehm-Reiser-Detlefs). Вы по-прежнему можете использовать RAII, интеллектуальные указатели и ручное удаление, но, запустив GC, вы также можете просто «забыть» удалить некоторые объекты.
@ В ответе Энди о том, что ресурсы распределяются слишком поздно, упущен важный момент: семантически важна не задержка освобождения ресурсов, а порядок их освобождения.
Причина, по которой GC имеет тенденцию плохо упорядочивать выпуск, заключается в том, что для него требуется топологическая сортировка требований к упорядочению (зависимостей), и это дорогостоящий алгоритм.
Тем не менее, у Ocaml GC есть интересная возможность, где вы можете прикрепить финализатор к объекту. Если объект становится недоступным, запускается финализатор, однако объект не удаляется (потому что финализатор может сделать его снова доступным: в этом случае вы даже можете подключить другой финализатор). Эти финализаторы могут обеспечить некоторый контроль над порядком.