2015-11-24 212 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