[Visual C++] DLLとアプリの文字コード差異によるメモリリーク

この記事は3年以上前に書かれた記事です。情報が古い可能性があります。

Visual C++ 2010 で MFC 拡張 DLL を作成して、同じく VC++ で作成した MFC アプリケーションからロードするとメモリリーク(解放漏れ)することがある。

DLL では特に何も処理していない。ウィザードで作成されたスケルトンをそのままビルドしただけのDLL。それを LoadLibrary() して FreeLibrary() するだけで、VC++ がメモリリークを検出する。(2010 は特に何も設定しなくても解放漏れチェックしてくれるっぽい)

これが不思議でしょうがなかったのだけど、あるきっかけで、プロジェクトのプロパティで文字セットの設定を変えたらメモリリークしなくなった!

具体的には、プロジェクトのプロパティの文字コードの設定が、アプリケーション側は「マルチバイト文字セット」となっていて、DLL側は「Unicode文字セット」になっていた。DLL側の文字セットをマルチバイトにしたら、リークを検出しなくなった。

どうも、DLL と アプリケーション(exe)の文字コードの設定が異なっていると上手くないらしい。DLL と アプリの間でお互いに確保すべきサイズと解放すべきサイズに齟齬が生まれているのかもしれない。

結構ハマッてたのでメモしておく。

タイトルとURLをコピーしました