0
virtualpointer=(char*) VirtualAlloc (NULL, (unsigned __int64) (1<<31), MEM_RESERVE, PAGE_READWRITE); 
mainhashbuf=progression=virtualpointer;
VirtualAlloc (progression, (unsigned __int64) (1<<15), MEM_COMMIT, PAGE_READWRITE);
progression=progression+capacity;
*(mainhashbuf+1000)='c';

mainhashbuf、progression、virtualpointerはcharへのポインタです。最初にスペースを予約し、仮想ポインターがそのスペースを指すようにします。次に、他の2つのポインターを仮想ポインターに等しく設定します。次に、プログレッション(現在はリザーブスペースも指している)を使用してそのスペースのコミット(1 << 15)を行い、プログレッションポインターをインクリメントします。次に、mainhashbufがポイントする必要がある現在コミットされているスペースに値を設定しようとしますが、書き込み例外が発生します。virtualallocを間違って使用しているか、ポインターが実際にどのように機能するかについて間違った概念を持っていますか?

4

1 に答える 1

4

VirtualAllocは、連続した範囲の仮想ページを割り当てようとします。1 << 31 == 0x80000000。これは、ユーザーモードプロセスがデフォルトでWindowsに持つメモリの量です。最初のVirtualAllocへの呼び出しが成功していることを私はひどく疑っています。

低い値を選択して、最初からやり直してください。また、なぜVirtualAllocを使用しているのですか?ポインタと直接メモリ管理に慣れていない場合、ページサイズの単位でコミットおよび予約するという概念は少し気が遠くなる可能性があります。最初にmalloc/HeapAllocを使用してみますか?また、VirtualAllocからの戻り値を確認し、それらがNULLでないことを確認してください。

于 2011-05-05T03:14:32.620 に答える