DLLでアプリ内でallocateした領域を解放するには?


はち  2005-08-10 17:26:45  No: 58603  IP: 192.*.*.*

初心者ですが宜しくお願いします。
DLLをVC++6.0で作成しました。そのDLLを使用するアプリから変数の領域(アプリがcallocで確保してます)を指すポインタを引数としてもらうのですが、DLL内部でこの領域を解放したいと思い、単純にfreeしてみました。
ところがデバックモードで_CrtIsValidHeapPointer(pUserData)とエラーのダイアログが出ます。調べたところアプリのヒープ領域とDLLのヒープ領域が別物であることが原因のようです。ランタイムライブラリも関係あるようですが。
良い解決方法がありましたら是非ご教授お願いします。

編集 削除
てつや  2005-08-10 17:45:25  No: 58604  IP: 192.*.*.*

callocした本人が責任を持ってfreeするのが正論だと思いますが...

私は以前APIの GlobalAlloc / GlobalFree を使いました。
ランタイムライブラリの違いも吸収できると思います。

編集 削除
シャノン  2005-08-10 21:54:41  No: 58605  IP: 192.*.*.*

てつやさんのおっしゃるように、Win32 API を使うのがよろしいかと。

使わないのであれば、基本的に、そういうことはすべきではありません。
どうしてもやりたいのであれば、exe と dll で同じランタイムライブラリ、かつ、「マルチスレッド(DLL)」のように、名前に「DLL」がつくものを使う必要があります。

編集 削除
はち  2005-08-11 14:37:06  No: 58606  IP: 192.*.*.*

てつやさん、シャノンさん有難うございます。
GlobalAlloc/GlobalFreeを使って実際にやってみました。うまくいきました。

(シャノンさん)
”〜「マルチスレッド(DLL)」のように、名前に「DLL」がつくものを使う必要があります。”というのはどういうことなのでしょうか?
せっかくなのでもう少し知識を深めたいと思います。宜しくお願いします。

編集 削除
シャノン  2005-08-13 05:19:55  No: 58607  IP: 192.*.*.*

VC++ 6 が手元に無くて、どのようにオプション設定したらよいかわかりません。
どなたかお持ちの方、フォローお願いいたします。

編集 削除
dairygoods  2005-08-13 11:14:23  No: 58608  IP: 192.*.*.*

画像見つけました。
http://www.kumei.ne.jp/c_lang/setvc.htm

編集 削除
シャノン  2005-08-14 16:04:11  No: 58609  IP: 192.*.*.*

フォローありがとうございます。

dairygoods さんが示してくれたページの、一番下の画像を見てください。
コンボボックスが4つ並んでいて、右上に「使用するランタイムライブラリ:マルチスレッド」ってなってるのがあります。
これを「マルチスレッド(DLL)」または「マルチスレッド(デバッグ, DLL)」にすることで、exe で確保したメモリを dll で free したりできるようになります。

ただし、念を押しますが、どうしてもやらざるを得ない場合のみにすべきです。

編集 削除