释放LPDIRECT3D9和LPDIRECT3DDEVICE9后的内存状态

时间:2013-10-30 14:53:56

标签: c++ winapi memory-management directx

这是C ++,WINAPI和DirectX。

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

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

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

1 个答案:

答案 0 :(得分:1)

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

因此,通常会发生以下情况:

  1. 程序调用{​​{1}}以分配10 MB
  2. malloc(10*1024*1024)调用VirtualAlloc()从操作系统分配10 MB的虚拟地址空间。
  3. 操作系统报告该程序正在使用10 MB以上的虚拟内存
  4. 程序使用内存
  5. 程序调用{​​{1}}取消分配10 MB
  6. malloc()不会调用free()将虚拟地址空间返回给操作系统。
  7. 就程序而言,内存已被释放,无法再次使用;这样做将是Undefined Behavior。就操作系统而言,内存仍在使用中。
  8. 如果程序稍后再次调用free()VirtualFree()可以直接再次返回该内存,而无需调用malloc(10*1024*1024)来分配更多的虚拟地址空间。
  9. 现在很明显,确切的行为取决于DirectX使用哪个分配器。一些分配器在程序释放后立即将内存释放回操作系统。但我的猜测是DirectX正在使用一个不这样做的分配器。

    这只是looking at the world through kernel-colored glasses的一个案例。