1

私は動的メモリ管理に関するプロジェクトを行っています。HeapCreate 関数と HeapAlloc 関数について混乱しています。

HeapCreate() 関数の場合、ヒープを作成でき、関数は HANDLE を返します。ヒープのサイズを初期化できます。

winHandle = HeapCreate( 0, 2 * 1024, 0); としましょう。

次に、HeapAlloc 関数を使用して、このヒープに割り当てることができます。しかし、ヒープのサイズについて混乱しています。例を試してみます。このヒープで HeapAlloc( winHandle, 0, 1024) を 2 回呼び出すので、合計は 2 * 1024 になります。ただし、HeapAlloc を何度も呼び出してもエラーは発生しません。

HeapAlloc( winHandle, 0, 1024) を 3 回呼び出すとします。割り当ての合計サイズは 3 * 1024 になります。これはヒープ サイズ 2 * 1024 よりも大きくなります。ただし、エラーは発生しません。

この質問に答えるのを手伝ってくれる人はいますか?

ありがとう、

ここにテストコードがあります。

// create heap, and return a headle(id) for that heap
HANDLE winHandle = HeapCreate( 0, sizeof(Dog), sizeof(Dog) );


// allocate the heap header to that handle 
void* s = HeapAlloc( winHandle, 0, sizeof(Dog) );   
// check if the alloc is success or not
assert( 0 != s );
printf("%p \n", s);
// load the heap header data
Dog* heapHeader = new(s) Dog( 1, 2, 4);


// allocate the heap header to that handle 
void* ss = HeapAlloc( winHandle, 0, sizeof(Dog) );
// check if the alloc is success or not
assert( 0 != ss );
printf("%p \n", ss);
// load the heap header data
Dog* heapHeadder = new(ss) Dog( 1, 2, 4);
4

1 に答える 1

5

API の使用が少しずれています。

HANDLE WINAPI HeapCreate(
    DWORD flOptions,
    SIZE_T dwInitialSize,
    SIZE_T dwMaximumSize );

この呼び出しの 2 番目のパラメーターは、ヒープの最大サイズではなく、初期サイズであることに注意してください。最大サイズに 0 を指定すると、最初のプールを使い果たすと、Windows はヒープの新しいメモリ ページをコミットしようとします。

編集

Windows は、指定された最大サイズをシステム ページ サイズの最も近い倍数に丸めることに注意してください。そのため、ヒープの実際のサイズは、要求したサイズよりも大きい場合があります。さらに、ヒープは、このメモリの一部を独自の内部簿記に使用します。したがって、ヒープのサイズに等しい単一の割り当てを行うことはできません。

于 2013-01-18T20:12:26.930 に答える