島野です。
> DLL と EXE をまたいでメモリ領域の確保と解放を行うのは普通は
> 「してはいけない事」です。
慣習的にそういうことはしないということでしょうか?
それとも、そういう仕様なのでしょうか?
(どこかに、参考になりそうなサイト等がありましたらご教授ください)
> ReleaseバージョンのDLLで確保したメモリを Debugバージョンの
> EXEのメモリマネージャ(メモリにはdebug情報が埋め込まれていると
> 思いこんでいる。)で解放したらどうなるか考えてみましょう。
今回の場合は、DLL/EXE ともに Debug バージョンですので、
そういうバージョン不整合の問題ではないと思います。
結局、まだ原因はわからないのですが、
DLLで定義したオブジェクトの push_back() が確保したメモリと
EXEで定義したオブジェクトの push_back() が確保したメモリの
アドレスの範囲が全然違うのが気になります。何か関係あるのでしょうか?
----------------------------------------------------------------------------
<DLLで定義した変数を使用した場合>
int main(int argc, char* argv[])
{
_expTmplVariable.push_back("AAA");
return 0;
}
<実際に確保されたメモリのイメージ>
00851500 21 00 00 00 01 00 00 00 3E 00 00 00 FD FD FD FD !.......>.......
00851510 00 41 41 41 00 CD CD CD CD CD CD CD CD CD CD CD .AAA.
00851520 CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
00851530 CD FD FD FD FD 00 00 00 00 00 00 00 00 00 00 00 ...............
<備考>
_expTmplVariable のデストラクタでヒープチェックに引っかかりアサートする。
_ASSERTE(_CrtIsValidHeapPointer(pUserData));
「無視」して続行すると、以下のエラーがデバッグウィンドウに表示される。
HEAP[main.exe]: Invalid Address specified to RtlFreeHeap( 340000, 8514f0 )
HEAP[main.exe]: Invalid Address specified to RtlValidateHeap( 340000, 851540 )
HEAP[main.exe]: Invalid Address specified to RtlFreeHeap( 340000, 851540 )
----------------------------------------------------------------------------
<EXEで定義した変数を使用した場合>
vector<string> expTmplVariable;
int main(int argc, char* argv[])
{
expTmplVariable.push_back("AAA");
return 0;
}
<実際に確保されたメモリのイメージ>
00431500 21 00 00 00 01 00 00 00 3E 00 00 00 FD FD FD FD !.......>.......
00431510 00 41 41 41 00 CD CD CD CD CD CD CD CD CD CD CD .AAA.
00431520 CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
00431530 CD FD FD FD FD 00 00 00 00 00 00 00 00 00 00 00 ...............
<備考>
何事も無く終了する。
----------------------------------------------------------------------------
--
> DLL と EXE をまたいでメモリ領域の確保と解放を行うのは普通は
> 「してはいけない事」です。
慣習的にそういうことはしないということでしょうか?
それとも、そういう仕様なのでしょうか?
(どこかに、参考になりそうなサイト等がありましたらご教授ください)
> ReleaseバージョンのDLLで確保したメモリを Debugバージョンの
> EXEのメモリマネージャ(メモリにはdebug情報が埋め込まれていると
> 思いこんでいる。)で解放したらどうなるか考えてみましょう。
今回の場合は、DLL/EXE ともに Debug バージョンですので、
そういうバージョン不整合の問題ではないと思います。
結局、まだ原因はわからないのですが、
DLLで定義したオブジェクトの push_back() が確保したメモリと
EXEで定義したオブジェクトの push_back() が確保したメモリの
アドレスの範囲が全然違うのが気になります。何か関係あるのでしょうか?
----------------------------------------------------------------------------
<DLLで定義した変数を使用した場合>
int main(int argc, char* argv[])
{
_expTmplVariable.push_back("AAA");
return 0;
}
<実際に確保されたメモリのイメージ>
00851500 21 00 00 00 01 00 00 00 3E 00 00 00 FD FD FD FD !.......>.......
00851510 00 41 41 41 00 CD CD CD CD CD CD CD CD CD CD CD .AAA.
00851520 CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
00851530 CD FD FD FD FD 00 00 00 00 00 00 00 00 00 00 00 ...............
<備考>
_expTmplVariable のデストラクタでヒープチェックに引っかかりアサートする。
_ASSERTE(_CrtIsValidHeapPointer(pUserData));
「無視」して続行すると、以下のエラーがデバッグウィンドウに表示される。
HEAP[main.exe]: Invalid Address specified to RtlFreeHeap( 340000, 8514f0 )
HEAP[main.exe]: Invalid Address specified to RtlValidateHeap( 340000, 851540 )
HEAP[main.exe]: Invalid Address specified to RtlFreeHeap( 340000, 851540 )
----------------------------------------------------------------------------
<EXEで定義した変数を使用した場合>
vector<string> expTmplVariable;
int main(int argc, char* argv[])
{
expTmplVariable.push_back("AAA");
return 0;
}
<実際に確保されたメモリのイメージ>
00431500 21 00 00 00 01 00 00 00 3E 00 00 00 FD FD FD FD !.......>.......
00431510 00 41 41 41 00 CD CD CD CD CD CD CD CD CD CD CD .AAA.
00431520 CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
00431530 CD FD FD FD FD 00 00 00 00 00 00 00 00 00 00 00 ...............
<備考>
何事も無く終了する。
----------------------------------------------------------------------------
--