gpt4 book ai didi

c++ - 释放 LPDIRECT3D9 和 LPDIRECT3DDEVICE9 后的内存状态

转载 作者:太空宇宙 更新时间:2023-11-04 11:46:30 25 4
gpt4 key购买 nike

这是 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)分配10MB
  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 使用的分配器不这样做。

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

关于c++ - 释放 LPDIRECT3D9 和 LPDIRECT3DDEVICE9 后的内存状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19686261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com