::Hikaru's blog

調べたこと, 考えたことをメモ.
<< December 2017 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>

スポンサーサイト

一定期間更新がないため広告を表示しています

- | permalink | - | -
<< printfについて | main | CRTのメモリリークのチェック機能 >>

mallocとfreeはモジュールを越えてはいけないのか

問. DLL内でmallocされたポインタをEXE側でfreeしてはいけないのか。また、new、deleteについてはどうか。

答. DLL、アプリケーションの両方でCRT(Cランタイムライブラリ)をダイナミックリンクしている場合はOK。

# 確認を行った環境はMicrosoft Visual C++ 7.1です。

以下、詳細な説明…


# new、deleteはmalloc、free相当のものを呼び出しているのでmalloc、freeに話を絞ります。

CRTのソースファイルを調べた結果、mallocはHeapAllocを呼び出し、freeはHeapFreeを呼び出します。
この時にヒープハンドルが一致しなければ当然エラーになります。
つまり、問題はヒープハンドルが一致するかどうかということになります。

ヒープハンドルはどのような場合に一致するか

CRTをスタティックリンクしている場合は、EXEとDLLで、それぞれCRTの初期化処理が行われ、それぞれにヒープが作成されます。
CRTをダイナミックリンクする場合は、MSVCR71.DLL(MSVCR71D.DLL)のロード時に初期化処理が行われ、ヒープが作成されます。
つまり、EXEとDLLの両方でCRTをダイナミックリンクしてやれば、CRTは同じヒープを使うことになり、malloc、freeはモジュールを超えて行うことが可能です。
(CRTをダイナミックリンクさせるには、コンパイルオプション/MDもしくは/MDdを指定する。)

# /MDdでは_malloc_dbg、_free_dbgを呼び出しているので、/MDと/MDdを混ぜることはできません。

C, C++ | permalink | comments(0) | trackbacks(0)

スポンサーサイト

- | permalink | - | -

この記事に対するコメント

コメントする









この記事のトラックバックURL
http://hikarukaru.jugem.cc/trackback/92
この記事に対するトラックバック