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


はち  2005-08-11 02:26:45  No: 58603

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


てつや  2005-08-11 02:45:25  No: 58604

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

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


シャノン  2005-08-11 06:54:41  No: 58605

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

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


はち  2005-08-11 23:37:06  No: 58606

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

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


シャノン  2005-08-13 14:19:55  No: 58607

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


dairygoods  2005-08-13 20:14:23  No: 58608

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


シャノン  2005-08-15 01:04:11  No: 58609

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加