デストラクタと静的デストラクタ
今std.socketの改善を試みているのだけど,それで嵌ったところ.これのshared static ~this()のGC.collect()をコメントアウトすると,同じWindowsでもErrorが飛んだり飛ばなかったりする.
shared static ~this() { // Avoids FinalizeError. D's GC may call the destructor of objects after static destructors. GC.collect(); // ここ version(Win32) { WSACleanup(); } }
原因はGCの呼ばれるタイミングが不定なことで,WSACleanupを呼んだ後これに依存している関数をオブジェクトのデストラクタが呼んでしまい,エラーになっていたというオチ.よくよく考えると静的デストラクタでもオブジェクトを操作することは可能なので,なんとなくデストラクタが先に呼ばれると思ってたけど,動作としてはおかしくないかもと思える.ということで,静的デストラクタで環境のクリーンアップとかを行う場合は,こういう点に気をつけないと再現しにくいバグの元となるので,気をつけましょう.
しかしGCに気をつけないと行けないというのも何だかなぁという感じだ.