释放LPDIRECT3D9和LPDIRECT3DDEVICE9后的内存状态

Memory status after releasing LPDIRECT3D9 and LPDIRECT3DDEVICE9

本文关键字:内存 状态 LPDIRECT3DDEVICE9 LPDIRECT3D9 释放      更新时间:2023-10-16

这是C++,WINAPI和DirectX。

我创建了一个简单的窗口,它在内存中占用了大约 1 Mb(如任务管理器所示)。当我创建 DirectX 对象(LPDIRECT3D9LPDIRECT3DDEVICE9 )时,它变成了 10 Mb。在我释放这两个之后:

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

内存不会回到 1 Mb,而是大约 3 Mb。所以我想知道是否还有其他事情要做,或者这是否正常。

这是

正常行为。 通常,当您通过 malloc() 等函数(或许多其他类似函数之一)分配大量内存时,在释放内存后,它不会立即返回到操作系统。 分配器通常会将内存保留在池中,假设程序可能想要再次分配内存,这样当它这样做时,它不必要求操作系统提供更多虚拟地址空间。

所以在引擎盖下,这是通常发生的事情:

  1. 程序调用malloc(10*1024*1024)分配 10 MB
  2. malloc()调用VirtualAlloc()从操作系统分配 10 MB 的虚拟地址空间。
  3. 操作系统报告程序正在使用 10 MB 以上的虚拟内存
  4. 内存由程序使用
  5. 程序调用free()以解除分配 10 MB
  6. free() 不会调用VirtualFree()将虚拟地址空间返回到操作系统。
  7. 就程序而言,内存被释放并且不能再次使用;这样做将是未定义的行为。 就操作系统而言,内存仍在使用中。
  8. 如果程序稍后再次调用malloc(10*1024*1024)malloc()可以直接再次返回该内存,而无需调用VirtualAlloc()来分配更多的虚拟地址空间。

现在很明显,确切的行为取决于 DirectX 在后台使用哪个分配器。 某些分配器会在程序释放内存后立即将内存释放回操作系统。 但我的猜测是,DirectX正在使用一个分配器,而分配器并没有这样做。

这只是通过内核色眼镜看世界的案例。