释放 LPDIRECT3D9 和 LPDIRECT3DDEVICE9 后的内存状态

Posted

技术标签:

【中文标题】释放 LPDIRECT3D9 和 LPDIRECT3DDEVICE9 后的内存状态【英文标题】:Memory status after releasing LPDIRECT3D9 and LPDIRECT3DDEVICE9 【发布时间】:2013-10-30 14:53:55 【问题描述】:

这是 C++、WINAPI 和 DirectX。

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

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

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

【问题讨论】:

如果您在谈论“记忆”,您必须具体说明您在谈论什么。在谈论任务管理器时,您还必须指定 Windows 版本。它显示的数字在 Windows 版本之间发生了很大变化。 【参考方案1】:

这是正常行为。通常,当您通过诸如malloc()(或许多其他类似函数之一)之类的函数分配大量内存时,在该内存被释放后,它不会立即返回给操作系统。分配器通常会在程序可能想要再次分配内存的假设下将内存保留在池中,这样当它这样做时,它不必向操作系统请求更多的虚拟地址空间。

所以在幕后,通常会发生以下情况:

    程序调用 malloc(10*1024*1024) 分配 10 MB 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的一个例子。

【讨论】:

以上是关于释放 LPDIRECT3D9 和 LPDIRECT3DDEVICE9 后的内存状态的主要内容,如果未能解决你的问题,请参考以下文章

基于FFmpeg的Dxva2硬解码及Direct3D显示

运行时错误:将 .push_back() 与 std::vector 一起使用时访问冲突?

为啥我插入 std::map 失败?

为啥我不能初始化 WNDCLASSEX wc?

动画精灵问题 (C++/DirectX9)

分配和释放 VS。自动释放。为啥和何时?