1

这是 C++、WINAPI 和 DirectX。

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

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

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

4

1 回答 1

1

这是正常行为。通常,当您通过诸如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 使用的分配器没有这样做。

这只是一个用有色眼镜看世界的例子。

于 2013-10-30T15:14:19.403 回答