0

わかりました、私はあきらめます。私は何を間違っていますか?これを行う単純な Windows C コンソール アプリがあります。

int buflen = 10;
PUCHAR ptr = LocalAlloc(LPTR, buflen);  // returns valid address
buflen = 20;
ptr = LocalReAlloc(ptr, buflen, 0); // returns NULL with GetLastError() = 8

私も同じ結果でこれを試しました:

ptr = LocalReAlloc(ptr, buflen, LPTR);

LocalReAlloc について知っておくべき秘密はありますか?

ありがとう。

4

1 に答える 1

4

あなたはフラグLocalAllocを渡しています(これは に含まれています)。そのため、メモリを適切な場所に再割り当てすることしかできません:LMEM_FIXEDLMEM_PTRLocalReAlloc

メモリがロックされた LMEM_MOVEABLE メモリ ブロックまたは LMEM_FIXED メモリ ブロックであり、このフラグが指定されていない場合、メモリはその場でのみ再割り当てできます。

これは、LocalReAllocが返すポインタの値を変更できないことを意味します。ローカル ヒープに既存のポインターのすぐ隣に空きメモリがある場合は、割り当てを拡張できます。メモリは固定されているため、新しいブロックを割り当てることはできません。

したがって、あなたの場合、そのLocalReAlloc場で再割り当てすることができず、8 - ERROR_NOT_ENOUGH_MEMORY である最高のエラーを返します。

それで、解決策は何ですか?LocalAlloc を使用しないでください。Win16 と一部の古い API をサポートするためにのみ存在します。この問題がない malloc()/realloc() を使用してください。

于 2013-04-26T20:38:49.497 に答える