这是C ++,WINAPI和DirectX。
我创建了一个简单的窗口,它占用内存中的1 Mb(如任务管理器中所示)。当我创建DirectX对象(LPDIRECT3D9
和LPDIRECT3DDEVICE9
)时,它会变成10 Mb。在我释放这两个之后:
if( pd3dDevice != NULL )
pd3dDevice->Release( );
if( pD3D != NULL )
pD3D->Release( );`)
内存不会回到1 Mb,但大约是3 Mb。所以我想知道是否还有其他事要做,或者这是否正常。
答案 0 :(得分:1)
这是正常行为。通常,当您通过诸如malloc()
(或许多其他类似函数之一)之类的函数分配大量内存时,在释放内存之后,它不会立即返回到操作系统。在假设程序可能想要再次分配内存的情况下,分配器通常会将内存保留在池中,这样,当它执行时,它不必向操作系统请求更多的虚拟地址空间。
因此,通常会发生以下情况:
malloc(10*1024*1024)
调用VirtualAlloc()
从操作系统分配10 MB的虚拟地址空间。malloc()
不会调用free()
将虚拟地址空间返回给操作系统。free()
,VirtualFree()
可以直接再次返回该内存,而无需调用malloc(10*1024*1024)
来分配更多的虚拟地址空间。现在很明显,确切的行为取决于DirectX使用哪个分配器。一些分配器将在程序释放后立即将内存释放回操作系统。但我的猜测是DirectX正在使用一个不这样做的分配器。
这只是looking at the world through kernel-colored glasses的一个案例。