2016-12-01 4 views
0

私はVirtualAllocで割り当てている2つのメモリ領域を持っています:0x1E0000 (Size: 0x39000, Reserve)0x219000 (Size: 0x3000, Commit)です。これらは両方とも同じ割り振り境界(この場合は0x40000 (64K*4)に丸められています)内にあり、第2の領域は最初の終了位置で開始します。1回のコールで両方を予約することなく、同じ割り当て内に2つの連続したメモリ領域を予約できないのはなぜですか?

ここで1分間コミットする部分は忘れてしまいます。 I MEM_RESERVE最初に0x39000、次にMEM_RESERVE、次の0x3000となると、ERROR_INVALID_ADDRESSとなります。しかし、私がMEM_RESERVEを1つにして0x39000+0x3000=0x3C000とすると、それはうまく動作し、MEM_COMMITを使って2番目の領域を正常にコミットできます。

なぜですか?なぜ、私は各予約部分を1つの大きな予約領域としてではなく、独自に予約することができないのですか?最初の領域を予約した後、割り当て内の残りの領域(0x219000-0x21FFFF)MEM_FREEの状態になるので、残りの0x7000の最初の0x3000を割り振り境界に予約するにはどうしたらいいですか?

+0

コメントコードを投稿してください。私はあなたがしようとしていることに従うことは難しいです。 –

答えて

4

同じ割り当て境界内に2つの個別の予約を持つことはできません。 VirtualAllocのためのドキュメントから

lpAddress割り当てるための領域の開始アドレス [オプションで]。 メモリが予約されている場合、指定されたアドレスは割り付け粒度の最も近い倍数に切り捨てられます。

(強調鉱山)

0x219000

そこで始まるメモリを予約するためのリクエストは、実際に違法従って既存のアロケーションの内側であり、これは、0x210000始まるメモリを予約しようと試みます。

(仮想メモリの特定の領域が予約可能であることは保証されていないことに注意してください; Windowsは既に別の目的で予約している可能性があります)ベストプラクティスは常にlpAddressパラメータNULLに、Windowsがあなたのためにアドレスを選択できるようにしてください)。

1

2つの予約を行うと、システムがそれらを別々に管理することを要求しますが、同じ割り当て境界内にあるため、単一の単位として管理される可能性があります。そのユニットの一部を要求すると、他の部分は使用されなくなります。

しかし、それらを一緒に予約すると、それらを一緒に管理するように要求しているので、分割する必要はありません。

割り当てる領域の開始アドレス:方法documentationから

。メモリが予約されている場合、指定されたアドレスは割り当て粒度の最も近い倍数に切り捨てられます。

したがって、実際には2番目のものは最初のものと同じ場所から開始します。

関連する問題