这是 C++、WINAPI 和 DirectX。
我创建了一个简单的窗口,它占用了大约 1 Mb 的内存(如任务管理器中所示)。当我创建 DirectX 对象(LPDIRECT3D9
和 LPDIRECT3DDEVICE9
)时,它变成了 10 Mb。在我释放这两个之后:
if( pd3dDevice != NULL )
pd3dDevice->Release( );
if( pD3D != NULL )
pD3D->Release( );`)
内存不会恢复到 1 Mb,而是大约 3 Mb。所以我想知道是否还有其他事情要做,或者这是否正常。
最佳答案
这是正常行为。通常,当您通过诸如 malloc()
(或许多其他类似函数之一)之类的函数分配大量内存时,在释放该内存后,它不会立即返回给操作系统.假设程序可能想要再次分配内存,分配器通常会将内存保留在池中,这样当它这样做时,它就不必向操作系统请求更多的虚拟地址空间。
所以在幕后,通常会发生以下情况:
- 程序调用
malloc(10*1024*1024)
分配10MB malloc()
调用VirtualAlloc()
从操作系统分配 10 MB 的虚拟地址空间。- 操作系统报告该程序多使用了 10 MB 的虚拟内存
- 内存被程序占用
- 程序调用
free()
释放 10 MB free()
不会调用VirtualFree()
将虚拟地址空间返回给操作系统。- 对于程序而言,内存被释放,不能再次使用;这样做将是未定义的行为。就操作系统而言,内存仍在使用中。
- 如果程序稍后再次调用
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/