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

标签 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。所以我想知道是否还有其他事情要做,或者这是否正常。

最佳答案

这是正常行为。通常,当您通过诸如 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/

相关文章:

c++ - Qt:如何使装饰丰富的弹出窗口代替默认的QSystemTrayIcon弹出窗口

c++ - 运算符为枚举重载

c++ - 如何在Qt/C++中设置Windows文件权限

c++ - 某些相关文件类型(.zip、.rar、...)的文件删除机制

linux - 防止备份读取进入 linux 页面缓存

C++测试矩阵是否已经初始化

c++ - 如何检查是否相等? (0 == i) 或 (i == 0)

c++ - 防止 ZMQ c++ 调用 rand()

c++ - 控制台内容

c++ - 为什么编译器在编译时不知道局部变量的地址?