NO son mutuamente excluyentes. Siéntase libre de usar C++ con libgc (recopilador Boehm-Reiser-Detlefs). Todavía puede usar RAII, punteros inteligentes y eliminación manual, pero con el GC funcionando también puede simplemente "olvidarse" de eliminar algunos objetos.
@ La respuesta de Andy con respecto a que los recursos se eliminan demasiado tarde pierde de vista el punto importante: no es la demora la liberación de recursos lo que es crucial semánticamente, sino más bien el orden de liberación.
La razón por la que GC tiende a no ordenar bien la liberación es que requeriría una clasificación topológica en los requisitos de pedido (dependencias) y eso es un algoritmo costoso.
Sin embargo, Ocaml GC tiene una instalación interesante donde puede conectar un finalizador a un objeto. Si el objeto se vuelve inalcanzable, se ejecuta el finalizador, sin embargo, el objeto no se elimina (porque el finalizador podría hacerlo accesible de nuevo: en ese caso, puede adjuntar otro finalizador). Estos finalizadores pueden proporcionar cierto control sobre los pedidos.
-1 La pregunta es incorrecta. Hay lenguajes recogidos de basura con destructores deterministas, p. 'IDisposable' en .NET proporciona destrucción determinista para C#, VB.NET y F #. –