4

出于某种原因,下面的代码会给我一个内存不足的错误。我错过了什么?

    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();
    }
4

3 回答 3

2

只是一个想法,但您是否考虑过:1920 * 1080 * 32 位 = 8294400 字节现在,8294400 字节 x 485 个纹理 = 3.836 GB 内存。这正好是 32 位机器的极限。我不知道您是在编写 32 位还是 64 位程序,但如果它是 32 位,那么您可以寻址的最大虚拟内存略低于 4GB,并且 512 个纹理会让您超过这个限制。考虑到 Release 不会立即释放此内存,并且如果您实际上是在 32 位编码,那么应该清楚为什么您会耗尽内存。

于 2013-01-27T00:57:48.247 回答
2

事实证明,catflier 在评论中提供了这个问题的答案:

release 不会立即发布,因为在代码上没有调用它永远不会这样做。调用 devicecontextFlush方法或存在的一些交换链(这将刷新设备)将导致资源删除

于 2014-08-29T16:57:50.083 回答
2

也许不是你的情况,但是,例如,Microsoft 的 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

于 2014-08-29T15:26:32.857 回答