2002-03-18 [長年日記]

メモリリーク

なんでDLLが違うとリークするのかと言うと、パフォーマンスをあげるためにメモリをプールしているため。そしてそのプールがDLL単位になってしまっているため。

1. A.DLL側でメモリを確保

2. B.DLLでそのメモリを開放

という状況になると、A.DLLではさっき確保したメモリを使いまわすことができなくて(B.DLLに保持されているから)、結局新たにメモリを確保する。B.DLLはそんなにメモリが必要ないので、無駄にプールを持っていることになる。というような状況になる。もちろん、B.DLL側でメモリが必要になればプールしてあるメモリを使うのだけれど、結局B.DLL側のプールにメモリがどんどんたまっていってしまうため、A.DLL側でメモリが必要になるたびに使用メモリがどんどん増えていってしまうことになる。

この辺って、DLLの間抜けなところだなぁ。soだとこんなことにはならないのに。DLLというよりは、Cランタイムの初期化ルーチンが間抜けなのか?