从 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
.
当使用 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
.