2015-11-24 214 views
1

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

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) 
     ); 

谢谢。

回答

2

一旦调用CreateBuffer回报,Direct3D的不需要你std::vector数据访问。使用Microsoft::WRL::ComPtr负责其余部分。当它超出范围时,它会调用ReleaseCreateBuffer返回的COM对象。只要引用计数为零,COM对象本身就会被释放。

这里要记住的一件事是,Direct3D使用非标准的COM生命周期模型:一旦Direct3D 11设备被销毁,所有由它创建的设备子对象即使仍然有效一个非零引用计数。因此,在您执行Direct3D设备的最终版本之前,通常会明确清理所有各种COM对象。随着Microsoft::WRL::ComPtr你可以用Reset做到这一点。

请参阅Direct3D SDK Debug Layer Tricks