mcrblog

vcpp-ml

2002年03月

29

[vcpp 00058056] Re: エクスポートしたSTL オブジェクトを使用するとアサート?

島野です。

>  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   ...............

<備考>
何事も無く終了する。
----------------------------------------------------------------------------

--
29

[vcpp 00058056] Re: エクスポートしたSTL オブジェクトを使用するとアサート?

島野です。

>  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   ...............

<備考>
何事も無く終了する。
----------------------------------------------------------------------------

--
29

[vcpp 00058055] Re: STL mapデータの検索について

篠原です。

On Fri, 29 Mar 2002 14:19:47 +0900
"黒川" <k...@mbc.sphere.ne.jp> wrote:

> という方法で行っていますが、上記のような未登録データの時、finddataの
> 内容が 0xccで初期化されています。VC++での初期化コードは 0xcd と
> 認識していたのですが、map は違うのでしょうか?

Debug 支援機能の一部で,VC++ の仕様ではありません。
詳細は「メモリ管理とデバッグ ヒープ」あたりをどうぞ。
ちなみに,0xCC の正体は /GZ オプションの解説をご覧下さい。

-----
// 篠原 昌二 (s...@daiichi-c.co.jp)
29

[vcpp 00058055] Re: STL mapデータの検索について

篠原です。

On Fri, 29 Mar 2002 14:19:47 +0900
"黒川" <k...@mbc.sphere.ne.jp> wrote:

> という方法で行っていますが、上記のような未登録データの時、finddataの
> 内容が 0xccで初期化されています。VC++での初期化コードは 0xcd と
> 認識していたのですが、map は違うのでしょうか?

Debug 支援機能の一部で,VC++ の仕様ではありません。
詳細は「メモリ管理とデバッグ ヒープ」あたりをどうぞ。
ちなみに,0xCC の正体は /GZ オプションの解説をご覧下さい。

-----
// 篠原 昌二 (s...@daiichi-c.co.jp)
29

[vcpp 00058054] Re: STL map データの検索について

石河@DSKです。

"黒川" <k...@mbc.sphere.ne.jp> schrieb:
>  これを検索するとき、iterator は使わずに
> A  finddata = mapA["未登録データ"];

これをやると、キー値"未登録データ"の要素が追加されてしまうと思いますが…

> という方法で行っていますが、上記のような未登録データの時、finddataの
> 内容が 0xccで初期化されています。VC++での初期化コードは 0xcd と
> 認識していたのですが、map は違うのでしょうか?

もしかしてfinddata.n != 0xcdcdcdcdならヒット、みたいな判定の仕方を考え
てますか?

>  また、検索方法自体が良くないとかあるのでしたら教えて下さい。

良くないと思います。find()を使いましょう。

Tschuess!
 ∧ ∧  ∩ 半ばは自己の幸せを、半ばは他人の幸せを
(・o・)_||
 |     | 石河(was 井島) 正@電算システム
 ∪ ̄∪∪ ̄∪ i...@densan-s.co.jp
  野獣之図
記事検索
Amazon.co.jp
  • ライブドアブログ