3

共有メモリの使用に関して 2 つの質問があります。CreateFileMapping を使用して、2 つのプロセス間で共有メモリ領域を作成しています。

1) メモリを解放するために、CreateFileMapping または OpenFileMapping 呼び出しから返されたすべてのハンドルで CloseHandle を呼び出す必要があることを理解しています。私の質問は、共有メモリを使用しているプログラムが CloseHandle を呼び出さずに終了した場合、Windows XP/7 によってすべてのハンドルが適切に閉じられ、メモリの割り当てが解除されるのでしょうか? IE - メモリを使用しているすべてのプロセスが閉じられた後、メモリ リークの可能性はありますか?

2) MapViewofFile を使用して、mem へのポインターを取得します。1 つのインスタンスでは、共有メモリは常にメソッドのコンテキストに存在すると想定しました。そのため、MapViewOfFile の戻り値をポインターとして保存し、mem へのハンドルを閉じて、共有 mem へのポインターを使用しています (ただし、アクセスはまだロックされています)。これは安全ですか、それとも共有メモリにアクセスするたびに MapViewOfFile を呼び出す必要がありますか?

ありがとう、

イアン

4

1 に答える 1

7

1) はい、すべてのハンドルは、プロセスが停止したり正常に終了したりしても、プロセスが終了すると閉じられます。ここに漏れはありません。

2) を呼び出さない限りUnmapViewOfFile、ハンドルが閉じられていても、プロセスはメモリにアクセスできます。

アプリケーションは、ファイル マッピング オブジェクトの作成に使用されたファイル ハンドルを閉じることができますが、システムは、ファイルの最後のビューがマップ解除されるまで、対応するファイルを開いたままにします。

于 2011-12-22T19:29:33.183 に答える