Visual C++ 2010 で MFC 拡張 DLL を作成して、同じく VC++ で作成した MFC アプリケーションからロードするとメモリリーク(解放漏れ)することがある。
DLL では特に何も処理していない。ウィザードで作成されたスケルトンをそのままビルドしただけのDLL。
それを LoadLibrary() して FreeLibrary() するだけで、VC++ がメモリリークを検出する。(2010 は特に何も設定しなくても解放漏れチェックしてくれるっぽい)
これが不思議でしょうがなかったのだけど、あるきっかけで、プロジェクトのプロパティで文字セットの設定を変えたらメモリリークしなくなった!
具体的には、プロジェクトのプロパティの文字コードの設定が、アプリケーション側は「マルチバイト文字セット」となっていて、DLL側は「Unicode文字セット」になっていた。DLL側の文字セットをマルチバイトにしたら、リークを検出しなくなった。
どうも、DLL と アプリケーション(exe)の文字コードの設定が異なっていると上手くないらしい。
結構ハマッてたのでメモしておく。
コメント