释放LPDIRECT3D9和LPDIRECT3DDEVICE9后的内存状态
Memory status after releasing LPDIRECT3D9 and LPDIRECT3DDEVICE9
这是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)
分配 10 MB -
malloc()
调用VirtualAlloc()
从操作系统分配 10 MB 的虚拟地址空间。 - 操作系统报告程序正在使用 10 MB 以上的虚拟内存
- 内存由程序使用
- 程序调用
free()
以解除分配 10 MB -
free()
不会调用VirtualFree()
将虚拟地址空间返回到操作系统。 - 就程序而言,内存被释放并且不能再次使用;这样做将是未定义的行为。 就操作系统而言,内存仍在使用中。
- 如果程序稍后再次调用
malloc(10*1024*1024)
,malloc()
可以直接再次返回该内存,而无需调用VirtualAlloc()
来分配更多的虚拟地址空间。
现在很明显,确切的行为取决于 DirectX 在后台使用哪个分配器。 某些分配器会在程序释放内存后立即将内存释放回操作系统。 但我的猜测是,DirectX正在使用一个分配器,而分配器并没有这样做。
这只是通过内核色眼镜看世界的案例。
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 识别打开的共享内存状态的方法
- 复制有状态分配器:标准库分配器语义和内部内存
- 远程电脑的 CPU 使用率和内存状态
- 如何检查我的 c++ 程序在内存中增长的状态
- 释放LPDIRECT3D9和LPDIRECT3DDEVICE9后的内存状态
- 这是存储 std::分配器状态的正确方法 - 在这种情况下,由 Windows 上的共享内存支持
- 在动态内存分配中,在程序终止并且忘记释放内存后,该内存是否保持分配状态