今日このバグが発生しました。これは、を呼び出した後にDLL内から割り当てられた文字列を使用していることが原因であることが判明しましたFreeLibrary()
。
これは、クラッシュを再現する簡単な例です。これはDLLになります:
void dllFunc(char **output)
{
*output = strdup("Hello"); // strdup uses malloc
}
これは、DLLをロードするEXEにあります。
void exeFunc()
{
char *output;
dllFunc(&output);
std::string s1 = output; // This succeeds.
FreeLibrary(dll);
std::string s2 = output; // This crashes with access violation.
}
のドキュメントを読みましたが、FreeLibrary()
呼び出された後にメモリが無効になることについては何も見つかりませんでした。
編集
EXEにVS2010ツールチェーンを使用しているときにDLLにVS2008ツールチェーンを使用していたことに気付きました(両方のIDEとしてVS2010を使用していましたが、プロジェクト設定からツールチェーンを選択できます)。DLLのツールチェーンをVS2010に設定すると、クラッシュも解消されました。