初心者ですが宜しくお願いします。
DLLをVC++6.0で作成しました。そのDLLを使用するアプリから変数の領域(アプリがcallocで確保してます)を指すポインタを引数としてもらうのですが、DLL内部でこの領域を解放したいと思い、単純にfreeしてみました。
ところがデバックモードで_CrtIsValidHeapPointer(pUserData)とエラーのダイアログが出ます。調べたところアプリのヒープ領域とDLLのヒープ領域が別物であることが原因のようです。ランタイムライブラリも関係あるようですが。
良い解決方法がありましたら是非ご教授お願いします。
callocした本人が責任を持ってfreeするのが正論だと思いますが...
私は以前APIの GlobalAlloc / GlobalFree を使いました。
ランタイムライブラリの違いも吸収できると思います。
てつやさんのおっしゃるように、Win32 API を使うのがよろしいかと。
使わないのであれば、基本的に、そういうことはすべきではありません。
どうしてもやりたいのであれば、exe と dll で同じランタイムライブラリ、かつ、「マルチスレッド(DLL)」のように、名前に「DLL」がつくものを使う必要があります。
てつやさん、シャノンさん有難うございます。
GlobalAlloc/GlobalFreeを使って実際にやってみました。うまくいきました。
(シャノンさん)
”〜「マルチスレッド(DLL)」のように、名前に「DLL」がつくものを使う必要があります。”というのはどういうことなのでしょうか?
せっかくなのでもう少し知識を深めたいと思います。宜しくお願いします。
VC++ 6 が手元に無くて、どのようにオプション設定したらよいかわかりません。
どなたかお持ちの方、フォローお願いいたします。
画像見つけました。
http://www.kumei.ne.jp/c_lang/setvc.htm
フォローありがとうございます。
dairygoods さんが示してくれたページの、一番下の画像を見てください。
コンボボックスが4つ並んでいて、右上に「使用するランタイムライブラリ:マルチスレッド」ってなってるのがあります。
これを「マルチスレッド(DLL)」または「マルチスレッド(デバッグ, DLL)」にすることで、exe で確保したメモリを dll で free したりできるようになります。
ただし、念を押しますが、どうしてもやらざるを得ない場合のみにすべきです。
ツイート | ![]() |