从 ID3D11Device::CreateBuffer(...) 释放内存

Release memory from ID3D11Device::CreateBuffer(...)

当使用 ID3D11Device::CreateBuffer(...) 创建缓冲区时,我们如何释放内存? 我的objective是为了防止内存泄漏。

    Microsoft::WRL::ComPtr<ID3D11Buffer> m_vertexBuffer;
    m_vertices = new std::vector<PNTVertex>();

    /*... fill m_vertices with vertices ...*/

    D3D11_BUFFER_DESC bd = { 0 };
    D3D11_SUBRESOURCE_DATA initData = { 0 };

    bd.Usage = D3D11_USAGE_DEFAULT;
    bd.ByteWidth = sizeof(PNTVertex)* m_verticesCount;
    bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    bd.CPUAccessFlags = 0;
    initData.pSysMem = m_vertices->data();
    DX::ThrowIfFailed(
        device->CreateBuffer(&bd, &initData, &m_vertexBuffer)
        );

谢谢。

一旦调用 CreateBuffer returns,Direct3D 就不需要您的 std::vector 数据可访问了。使用 Microsoft::WRL::ComPtr 会处理剩下的事情。当它超出范围时,它将对从 CreateBuffer 返回的 COM 对象调用 Release。只要引用计数为零,COM 对象本身就会被释放。

这里要记住的一件事是 Direct3D 使用非标准的 COM 生命周期模型:一旦 Direct3D 11 设备被销毁,从它创建的所有 'device children' 对象将立即失效,即使它们仍然有一个非零的引用计数。因此,您通常会在最终发布 Direct3D 设备之前明确清除所有各种 COM 对象。使用 Microsoft::WRL::ComPtr 你可以使用 Reset.

Direct3D SDK Debug Layer Tricks