2011-09-06 15 views
6

Bir sınıfta değil, modül düzeyinde olan bazı yardımcı işlevleri (günlüğe kaydetme için) içeren genel bir D modülüne sahibim. Ancak, bu işlevleri bir yıkıcıdan çağırırken, bir core.exception.OutOfMemoryError alıyorum ve/veya uygulama kilitleniyor ve çöküyor. Burada yanlış bir şey mi yapıyorum?D'deki destructor'dan modül seviyesi işlevlerini çağırma (bir OutOfMemoryError atmış gibi görünüyor)

bir soyulmuş test durumda:

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

çöp toplayıcısı, şu anda içinden adı atılan istisnalar veya bellek ayırmalarını desteklemez
module main.class; 
import main.logger; 

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

Evet; Hatayı yeniden oluşturmak için en az bir test çantası sağlamadan belirsiz bir soru gönderiyorsunuz. Alınma yok. – FeepingCreature

+0

Şu anda küçük bir test vakası alabilirim. –

cevap

4

bir finalizer. Böylece, bir tahsisatın neden olduğu veya bir sınıf yıkıcıdan yakalanmamış bir istisna atarak herhangi bir şeyi güvenilir bir şekilde yapamazsınız.

+0

Bu, writeln'in devam eden bazı arka plan tahsislerine sahip olabileceğini varsayar. –

+0

Çözüm: printf işlevini kullanın. – BCS

+1

@Mark dizesi işlevinde log dizgisi ayırma da – cybevnm

İlgili konular