8

さまざまな理由から、C ランタイムから Windows ヒープ API を使用するランタイムに移植しようとしているコードがあります。問題が発生しました: malloc/ calloc/ realloc/free呼び出しをHeapAlloc/ HeapReAlloc/ HeapFree(GetProcessHeapハンドル用) にリダイレクトすると、メモリは正しく割り当てられているように見えます (不良ポインターが返されず、例外もスローされません)。移植すると、何らかの理由で「メモリの割り当てに失敗しました」と表示されます。

Microsoft CRT (下でヒープ API を使用) と別の会社のランタイム ライブラリ (下でグローバル メモリ API を使用) の両方でこれを試しました。これらの両方の malloc はライブラリでうまく機能しますが、何らかの理由で、ヒープ API を直接使用すると機能しません。

割り当てが大きすぎないこと (>= 0x7FFF8 バイト) を確認しましたが、そうではありません。

私が考えることができる唯一の問題は、メモリの配置です。そうですか?またはそれ以外に、私が認識していないヒープ API と CRT メモリ API の根本的な違いはありますか?

もしそうなら、それは何ですか?そうでない場合、静的なMicrosoft CRT (Visual Studio に含まれています) がmalloc/callocを呼び出す前に追加の手順を実行するのはHeapAllocなぜですか? 違いがあるのではないかと思いますが、それが何であるかはわかりません。

ありがとうございました!

4

2 に答える 2

3

難しい方法を知ったので...

違いは根本的なものではありませんが、HeapReAlloc(これは を使用しますRtlReAllocateHeap) はnull ポインターを呼び出しのヒントとして自動的に扱いませHeapAlloc。代わりに失敗します。

于 2011-01-04T03:20:52.950 に答える