mcrblog

vcpp-ml

2002年03月

30

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

中村です。

At 29 Mar 2002 23:42:07 +0900 炎羅 wrote:
> > それとも、そういう仕様なのでしょうか?

>  メモリを管理しているマネージャが違います。
>  大原則です。

ほんとですか?
C-Runtimeをスタティックリンクしていたら確かに別になりますが、MSVCRT.DLLを
使うようになっていたら同じになると思いますが。

# もっとも、受渡ししない方が良いということ自体は賛成ですけど。

元々の問題は、C-Runtimeをスタティックリンクしているのが原因じゃないんでし
ょうか?

---
Satoshi Nakamura <s...@zak.att.ne.jp>
30

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

 黒川です。
 επιστημηさん、石河@DSKさん、返信ありがとうございます。
# まとめて返信させてもらいます。

> > A  finddata = mapA["未登録データ"];
>
》 operator[]を使うと、登録されていないキーで検索するごとに
》 未登録データが追加されます。それでよければ問題ありません。
> これをやると、キー値"未登録データ"の要素が追加されてしまうと思いますが…
---
 いえ、大きな勘違いでした。登録されては問題ありでしたので助かりました。
デバッグ時に数十件登録していたので、気づきませんでした..

》 デフォルトコンストラクタを書けば、その中身は好きにできます。
》 そもそも初期化時に勝手に埋めてくれる値をアテにしてはイケナイのでは?
> もしかしてfinddata.n != 0xcdcdcdcdならヒット、みたいな判定の仕方を考え
> てますか?
>
> >  また、検索方法自体が良くないとかあるのでしたら教えて下さい。
> 良くないと思います。find()を使いましょう。
---
 STLのサンプルにfind()がありました。以下のようにすることで対応できました。
未登録データは finddata.n = 0 にしたかったのですが、デフォルトコンストラクタ
はsutructの話ですよねぇ..、(mapでは知りません)

  typedef struct _tagA {
       DWORD  n;
       BYTE  bary[10];
       tagA() : n(0) { memset(bary, 0, 10); }
  } A;
  // 検索部
  mapA::iterator itr1 = mapA.find("未登録データ");
  A finddata;
  if (itr1 != mapA.end()) {
      finddata = (A)((*itr1).second);
  }
  // A finddata = (A)((*itr1).second); だと 0xcdになりました。

# まだおかしい点がありましたら、ご指摘下さい。では
/------------------------------------------/
/  E-mail  : k...@mbc.sphere.ne.jp                     /
/ Win95/VC++6.0(SP5)                                          /
/------------------------------------------/
30

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

 黒川です。
 επιστημηさん、石河@DSKさん、返信ありがとうございます。
# まとめて返信させてもらいます。

> > A  finddata = mapA["未登録データ"];
>
》 operator[]を使うと、登録されていないキーで検索するごとに
》 未登録データが追加されます。それでよければ問題ありません。
> これをやると、キー値"未登録データ"の要素が追加されてしまうと思いますが…
---
 いえ、大きな勘違いでした。登録されては問題ありでしたので助かりました。
デバッグ時に数十件登録していたので、気づきませんでした..

》 デフォルトコンストラクタを書けば、その中身は好きにできます。
》 そもそも初期化時に勝手に埋めてくれる値をアテにしてはイケナイのでは?
> もしかしてfinddata.n != 0xcdcdcdcdならヒット、みたいな判定の仕方を考え
> てますか?
>
> >  また、検索方法自体が良くないとかあるのでしたら教えて下さい。
> 良くないと思います。find()を使いましょう。
---
 STLのサンプルにfind()がありました。以下のようにすることで対応できました。
未登録データは finddata.n = 0 にしたかったのですが、デフォルトコンストラクタ
はsutructの話ですよねぇ..、(mapでは知りません)

  typedef struct _tagA {
       DWORD  n;
       BYTE  bary[10];
       tagA() : n(0) { memset(bary, 0, 10); }
  } A;
  // 検索部
  mapA::iterator itr1 = mapA.find("未登録データ");
  A finddata;
  if (itr1 != mapA.end()) {
      finddata = (A)((*itr1).second);
  }
  // A finddata = (A)((*itr1).second); だと 0xcdになりました。

# まだおかしい点がありましたら、ご指摘下さい。では
/------------------------------------------/
/  E-mail  : k...@mbc.sphere.ne.jp                     /
/ Win95/VC++6.0(SP5)                                          /
/------------------------------------------/
29

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

 こんにちは、炎羅です。

On Fri, 29 Mar 2002 22:04:46 +0900
"Yuji Shimano" <y...@igfs.scs.co.jp> wrote:

> それとも、そういう仕様なのでしょうか?

 メモリを管理しているマネージャが違います。
 大原則です。

> 結局、まだ原因はわからないのですが、

 原因は既に判明していると思うのですが^^;;
 DLL-EXE間でのメモリ管理マネージャの不整合が原因です。

 vectorは伸縮する時に、以前よりもサイズの大きい(2のべき数)メモリを
 確保し、以前のメモリ領域を解放します。
 この時に、DLL側で確保されたメモリを、EXE側が解放し、
 かつEXE側で確保したメモリを、終了時にDLL側が解放する事になります。

 allocatorを独自に作ってvectorの構築をするか、operator new,
 operator deleteをオーバーロードして、EXE側のメモリマネージャを使うよう
 にするなどの、一工夫が必要です。

■ Written by 炎羅 (e...@mail.interq.or.jp) ■
29

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

 こんにちは、炎羅です。

On Fri, 29 Mar 2002 22:04:46 +0900
"Yuji Shimano" <y...@igfs.scs.co.jp> wrote:

> それとも、そういう仕様なのでしょうか?

 メモリを管理しているマネージャが違います。
 大原則です。

> 結局、まだ原因はわからないのですが、

 原因は既に判明していると思うのですが^^;;
 DLL-EXE間でのメモリ管理マネージャの不整合が原因です。

 vectorは伸縮する時に、以前よりもサイズの大きい(2のべき数)メモリを
 確保し、以前のメモリ領域を解放します。
 この時に、DLL側で確保されたメモリを、EXE側が解放し、
 かつEXE側で確保したメモリを、終了時にDLL側が解放する事になります。

 allocatorを独自に作ってvectorの構築をするか、operator new,
 operator deleteをオーバーロードして、EXE側のメモリマネージャを使うよう
 にするなどの、一工夫が必要です。

■ Written by 炎羅 (e...@mail.interq.or.jp) ■
記事検索
Amazon.co.jp
  • ライブドアブログ