2011-01-03 9 views
7

私は様々な理由から、CランタイムからWindowsヒープAPIを使用するものに移植しようとしているというコードを持っています。私は、問題が発生しました:私はHeapAlloc/HeapReAlloc/HeapFreeからmalloc/calloc/realloc/freeコール(ハンドル用GetProcessHeap付き)をリダイレクトする場合は、メモリが正しく割り当てられているようだ(何の悪いポインタが返されず、例外はスローされません)しかし、私が移植しているライブラリは何らかの理由で "メモリを割り当てられませんでした"と言っています。mallocとHeapAllocの間には基本的な違いがありますか(移植性を除いて)?

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

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

私が考えることができる唯一の問題は、メモリアライメントです。その場合ですか?それ以外のヒープAPIと私が気づいていないCRTメモリAPIの間には根本的な違いがありますか?

もしそうなら、それは何ですか?そしてもしそうでなければ、なぜスタティックマイクロソフトCRT(ビジュアルスタジオに付属)はHeapAllocを呼び出す前にmalloc/callocでいくつかの追加ステップを取るのですか?私は違いがあると思っていますが、私はそれが何であるか考えることができません。

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

答えて

3

私はハードな方法を発見したよう...

差ががない自動的HeapAllocを呼び出すためのヒントとしてNULLポインタを扱うん(RtlReAllocateHeapを使用する)基本的なものではなく、HeapReAlloc。代わりに失敗します。

+1

HeapAllocは、0のサイズのポインタに対してもメモリを割り当てません。ここではmallocが使用されます。また、HeapAllocはmallocを呼び出せませんでした。新しいハンドラが問題を修正できなかった場合は、循環呼び出しにつながります。 – Necrolis

+0

私は誤字がありました。それを固定しました、ありがとう。 – Mehrdad

関連する問題