1

これは、C++、WINAPI、および DirectX です。

単純なウィンドウを作成すると、メモリ内で 1 Mb ほど占有します (タスク マネージャーで確認)。DirectX オブジェクト (LPDIRECT3D9およびLPDIRECT3DDEVICE9) を作成すると、10 Mb 程度になります。これら2つをリリースした後:

if( pd3dDevice != NULL )  
    pd3dDevice->Release( );
if( pD3D != NULL )  
    pD3D->Release( );`) 

メモリは 1Mb には戻りませんが、約 3Mb に戻ります。だから、他にやるべきことがあるのだろうか、それともこれが普通なのだろうか。

4

1 に答える 1

1

これは正常な動作です。通常、(または他の多くの同様の関数の1つ)などの関数を介して大量のメモリを割り当てると、malloc()そのメモリが解放された後、すぐにOSに返されません。多くの場合、アロケーターは、プログラムがメモリを再度割り当てたいと考えている場合に備えて、メモリをプール内に保持します。そのため、その場合、OS に追加の仮想アドレス空間を要求する必要はありません。

内部的には、通常は次のようになります。

  1. malloc(10*1024*1024)10 MB を割り当てるプログラム呼び出し
  2. malloc()VirtualAlloc()OS から 10 MB の仮想アドレス空間を割り当てる呼び出し。
  3. OS は、プログラムが 10 MB 以上の仮想メモリを使用していると報告します
  4. メモリはプログラムによって使用されます
  5. free()10 MB の割り当てを解除するプログラム呼び出し
  6. free()VirtualFree()仮想アドレス空間を OS に戻すために呼び出しません。
  7. プログラムに関する限り、メモリは解放され、再度使用することはできません。そうすることは、未定義の動作になります。OSに関する限り、メモリはまだ使用中です。
  8. プログラムが後でmalloc(10*1024*1024)再度呼び出す場合は、仮想アドレス空間をさらに割り当てるためにmalloc()呼び出すことなく、そのメモリを直接返すことができます。VirtualAlloc()

明らかに、正確な動作は、内部で DirectX が使用するアロケーターによって異なります。一部のアロケータ、プログラムがメモリを解放した直後にメモリを解放して OS に戻します。しかし、私の推測では、DirectX はそうしないアロケーターを使用していると思います。

これは、カーネル色のメガネを通して世界を見ている場合にすぎません。

于 2013-10-30T15:14:19.403 に答える