2

MS Security の例では、ある関数のドキュメントで 1 つのメモリ割り当てルーチンを使用し、別の関数で別のメモリ割り当てルーチンを使用しているように見えるのはなぜですか?

サンプルコードのさまざまなポイントで実際に異なるものを使用している例を見つけました。関数を参照してくださいGetAppContainerNamedObjectPath

これはHeapAlloc、SID をLocalAlloc割り当てるときとセキュリティ記述子を割り当てるときの両方で使用されます。例が終了する前に両方の割り当てが解放されますが、なぜ異なる方法を使用しているのでしょうか? ::mallocブログの例で人々が使用しているのを見てきました。

4

2 に答える 2

1

LocalAllocHeapAllocこの場合も同じです。これは常にそうであったわけではありませんが、少なくとも 10 年間はそうでした。紛らわしいのは承知していますが、これはすべて、従来の 16 ビット システムと下位互換性の結果です。このドキュメントを参照してください:

Windows のメモリ管理では、16 ビット > Windows のように、個別のローカル ヒープとグローバル ヒープは提供されません。結果として、関数のグローバル ファミリとローカル ファミリは同等であり、どちらを選択するかは個人的な好みの問題です。

このドキュメントも参照してください:

プライベート ヒープから割り当てられたメモリと、他のメモリ割り当て関数を使用して割り当てられたメモリに違いはありません。関数の完全なリストについては、メモリ管理関数の表を参照してください。

違いがありますので、常にメモリ機能のドキュメントをお読みください。たとえば、CoTaskMemFreeNULL を処理しますが、処理HeapFreeしません。さまざまな割り当て関数により、メモリの割り当て方法と OS オブジェクト (プロセスなど) 間での共有方法をさまざまなレベルで制御できます。ただし、プロセスに単純な古いメモリが必要な場合は、使用している API のドキュメントを常に確認してください。特定の割り当て関数または解放関数を使用する必要があると指定されている場合がありますが、それ以外の場合は、1 つを選択して一貫性を保つようにしてください。

ドキュメントがそれを切り替える理由は何ですか?私の推測では、時間の経過とともに複数の人物によってハッキングされたものであり、その中には実際の OS チームのメンバーはいませんでした。MSDN サンプル コードは悪名高いです。フラグを立てるか、MSDN ページにフィードバックを残す方法があるはずです。

于 2013-10-08T17:53:53.857 に答える
0

MS Security の例では malloc を使用しません。私によると、malloc 関数には実行時の依存関係があるという欠点があります。HeapAlloc (RtlReAllocateHeap を使用) はサイズ 0 のポインターにメモリを割り当てません。malloc と LocalAlloc のオーバーヘッドは HeapAlloc よりも大きくなります。 、ただし malloc より小さい。

于 2013-10-08T18:06:52.290 に答える