Otros han mencionado los destructores de nivel de módulo, pero eso no es realmente práctico ya que requiere demasiado mantenimiento manual, y D tiene una peculiaridad irritante si los módulos con constructores/destructores estáticos no pueden tener importaciones cíclicas. Por ejemplo:
Módulo A
module A;
import B;
static ~this() {}
void main() {}
Módulo B
module B;
import A;
static ~this() {}
intenta ejecutar ...
% dmd A.d B.d
% ./A
Cycle detected between modules with ctors/dtors:
A -> B -> A
[email protected]/rt/minfo.d(331): Aborting!
D hace esto en caso de que tus destructores dependan el uno del otro, incluso cuando no lo hagan. Esto te obliga a hacer una "refactorización" extraña de tu código para evitar este problema. No hay forma de decirle a D que no hay realmente una dependencia.
Una mejor solución para manejar la destrucción de recursos es tratar de abarcar tanto como sea posible. No tiene recursos globales que requieran destrucción, y no confíe en los finalizadores de clase para nada, porque no se garantiza que funcionen alguna vez (Java tiene el mismo problema).
Como alternativa, simplemente haga cosas como lo hacen en C: apagado manual. Es un poco más de trabajo, pero realmente no es un gran problema. Sin duda es más fácil que luchar con importaciones cíclicas.
En ** C++ ** hay un escenario similar en caso de excepciones no controladas. –
@ K-ballo: Correcto, pero durante la salida de la aplicación * normal *, no puedo garantizar que todos mis objetos sean destruidos. Esto es bastante inconveniente. –
@TravisGockel ¿podría editar la pregunta para incluir el número de página? – Arlen