2011-09-06 9 views
6

Tengo un módulo D global que contiene algunas funciones auxiliares (concretamente para el registro), que están en el nivel de módulo y no en una clase. Sin embargo, cuando invoco estas funciones desde un destructor, obtengo un core.exception.OutOfMemoryError y/o la aplicación se cuelga y falla. ¿Estoy haciendo algo mal aquí?Llamar a funciones de nivel de módulo desde destructor en D (parece arrojar un OutOfMemoryError)

Un caso de prueba reducidos al mínimo:

logger.d

module main.logger; 
void log(const(char)[] msg) { 
    auto time = // GET TIME OF DAY SOMEHOW 
    std.stdio.writeln(std.conv.to!string(time) ~ " " ~ msg); 
} 

class.d

module main.class; 
import main.logger; 

class A { 
    public: 
     this() {} 
     ~this() { log("Destructor"); } 
} 
+0

Sí, lo eres; está publicando una pregunta vaga sin proporcionar una prueba mínima para reproducir el error. Sin ofender. – FeepingCreature

+0

Puedo batir un pequeño estuche de prueba ahora mismo. –

Respuesta

4

El recolector de basura Actualmente no admite excepciones producidas o las asignaciones de memoria llamadas desde dentro un finalizador Por lo tanto, no puede hacer nada confiablemente que cause una asignación o arroje una excepción no detectada desde dentro de un destructor de clase.

+0

Eso tendría sentido, suponiendo que writeln podría tener algunas asignaciones de fondo pasando. –

+0

Solución: use 'printf'. – BCS

+1

@Mark concatenación de cadenas en la función de registro es la asignación también – cybevnm

Cuestiones relacionadas