为什么我得到E_OUTOFMEMORY
Why am I getting E_OUTOFMEMORY?
本文关键字:OUTOFMEMORY 为什么 更新时间:2023-10-16
由于某些原因,下面的代码会给我一个内存不足的错误。我错过了什么?
for(int n = 0; n < 512; ++n)
{
D3D11_TEXTURE2D_DESC texture_desc = {};
texture_desc.Width = 1920;
texture_desc.Height = 1080;
texture_desc.MipLevels = 1;
texture_desc.ArraySize = 1;
texture_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
texture_desc.SampleDesc.Count = 1;
texture_desc.Usage = D3D11_USAGE_DEFAULT;
texture_desc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
ID3D11Texture2D* target_d3d_ptr;
HRESULT hr = this->device_ptr->CreateTexture2D(&texture_desc, nullptr, &target_d3d_ptr);
if(FAILED(hr))
throw runtime_error(_com_error(hr).ErrorMessage());
target_d3d_ptr->Release();
}
只是一个想法,但是你考虑过这个吗?1920 * 1080 * 32bits = 8294400字节现在,8294400字节x 485纹理= 3.836 gb内存。这是32位计算机的极限。我不知道你是在编码32位还是64位程序,但如果是32位,那么你可以处理的最大虚拟内存略低于4GB, 512纹理会超过这个限制。考虑到Release不会立即释放内存,如果实际上是在32位编码,那么应该清楚为什么会耗尽内存。
也许这不是你的情况,但是,例如,微软的COM方法CComObject::CreateInstance
可以返回E_OUTOFMEMORY
(至少在我的环境中可以找到的实现,即Visual Studio 2012),在我看来,它可能会误导。
COM方法类似于以下内容(在atlcom.h
中)
ATLPREFAST_SUPPRESS(6387)
template <class Base>
_Success_(return == S_OK) HRESULT WINAPI CComObject<Base>::CreateInstance(
_Deref_out_ CComObject<Base>** pp) throw()
{
// code omitted
HRESULT hRes = E_OUTOFMEMORY;
CComObject<Base>* p = NULL;
ATLTRY(p = new CComObject<Base>())
if (p != NULL)
{
// code omitted
}
*pp = p;
return hRes;
}
ATLPREFAST_UNSUPPRESS()
,在我看来,上面的代码可以返回E_OUTOFMEMORY
,即使你有很多内存仍然可用:宏ATLTRY
只是包装调用new
在一个try-catch(…)块,所以如果Base
的构造函数抛出异常失败,任何类型的异常,甚至与内存问题无关,那么p
将是NULL
,函数将返回E_OUTOFMEMORY
。
事实证明,catflier在评论中提供了这个问题的答案:
release不会立即释放,因为在代码中没有调用它永远不会这样做。调用devicecontext
Flush
方法或者某些交换链存在(会冲洗设备)会导致资源删除
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 为什么会发生堆损坏
- 为什么使用 "this" 指针调用派生成员函数?
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么比较运算符如此快速
- 为什么 Serial.println(<char[]>);返回随机字符?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 为什么不;名字在地图上是按顺序排列的吗
- 我的字符计数代码计算错误.为什么
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 为什么 std::unique 不调用 std::sort?
- 既然存在危险,为什么项目要使用-I include开关
- 为什么在尝试创建解码器时出现OutOfMemory异常