2011-01-24 25 views
4

私はVisual Studio 2005/2008を使用して1.dllと言うDLLを開発すると、このDLLをロード時に1.exeというコンソールアプリケーションにリンクします(ヘッダファイルと.libファイルを使用)。 DLL、実行時にメモリを割り当てる場合、誰がヒープ(フリーストア)をDLLに割り当てるか。DLLにヒープを割り当てるのは誰ですか?

私は、DLLがデータ、コード、スタックにプロセスのアドレス空間を使用することを理解しています。

+4

誰がこの質問をStackOverflowで理解していますか? – leppie

+0

あなたはどういう意味ですか? –

+1

@leppie:ご覧ください、私は説明し、私の質問を明確にしようとしました。 – Vikas

答えて

5

- あなたは、常にいくつかの言語でそれを書く - それはそのfreestoreを作成し、決定する責任があるC++ランタイムである場合のVisual Studio 2005または2008

を使用して、あなたの場合C++にそれをどのように割り当てるか。

具体的には、Dllランタイムオプションを使用すると、単一のdll - msvcrtxx.dll - そのdllにリンクされているすべてのdllファイルとexeファイルの間で共有される単一のフリーストアを管理します。

exeとdllをbeuidingするときに静的ランタイムオプションを使用すると、exeと各dllは独自のfreestore管理でlibcのインスタンスを構築します。

0

あなたはメモリ管理を行います。 DLLには別々のヒープがあるため、自分で管理する必要があります。もちろん、あなたの環境によっては、あなたの都合に合わせて特別な新しい/削除があるかもしれません。

は、動的メモリの2種類が、を扱うようにして離れて保つことがあります。

  • あなたが呼び出すprocess' heap使用することができますが、それは明らかに、すべての呼び出し元のプロセスのために別のものになります。だから、それは発信者に応じてデータのためだけに使います。

  • DLLが呼び出し元とは無関係に一般的に使用するメモリについては、HeapCreateとその兄弟関数を使用して別の "プライベート"ヒープを取得する必要があります。

そのメモリの責任を他のものに引き渡さないように注意してください。あなたのDLLが割り当てたものは、あなたのDLLが削除されます。そうしないと、問題が発生します。それは基本的な規則でなければなりませんが、GCの上で責任ある使用方法を忘れる人もいるので、言及します。

+0

あなたはここで何を指していますか?誰がDLLにヒープを提供しますか? – Vikas

+1

@Vikas:*あなたがDLLを書き込むと、メモリ管理を行うのはあなたの仕事です。 – poke

+0

彼の理由を説明してもらえますか? – foo

3

DLL内でコードを実行すると、プロセスのコンテキストと呼び出し元のスレッドでコードが実行され、その方法でメモリがプロセス空間に割り当てられます。

DLLの実装はもちろん、新しいスレッドまたは新しいプロセスに及ぶことがあります。後者の場合、メモリの割り当ては新しいフォークされたプロセスで行われます。

つまり、1.exeがDLLを実行すると、スタックを含めて割り当てられたすべてのメモリがプロセスメモリ空間に移動します(つまり、DLLが1 GBのメモリを割り当てた場合、プロセスのメモリ消費量に反映されます)。あなたはDLLを作るとき

関連する問題