Ruby拡張ライブラリと、RubyのMSVCRTバージョン違いまとめRuby拡張ライブラリと、Ruby、それからRuby拡張ライブラリが依拠するDLLの3つのプレイヤーがいる場合に、Rubyが落ちる場合と落ちない場合がある。通常、まずいのは次の組み合わせだ。RubyがリンクしたMSVCRTと拡張ライブラリがリンクしたMSVCRTが異なる。これは、mallocとfreeのMSVCRTの実装による。・もしかすると、MSVCRT70以降は共通化されているかも知れないが未確認。・理屈上で確認しているのは、MSVCRT(6)とそれ以降の任意の1つとの組み合わせこれは、次の状況で発生する(追記あり)。・拡張ライブラリでマクロを利用してオブジェクトを生成する(具体的にはData_Make_Struct)。マクロなのでmallocの呼び出しは拡張ライブラリ側のMSVCRTで行う。・GCで上記オブジェクトを回収。GCのfreeなのでRuby側のMSVCRT側で行うそれに対して、拡張ライブラリが利用するサードパーティDLLはRubyオブジェクトを利用することはないので、よほど生なAPI(mallocしたオブジェクトを返すのでfreeは呼び出し側でやってくれ、というようなもので、しかもWin32APIではなくMSVCRTのmallocを利用する)が無ければ問題ない。readlineのMSVCRT(6)が、rubyとreadline.soをMSVCRT(100)で利用すると落ちるのだった。なんでだか追っかけたら、fdの問題だった。