使用CreateTexture2D后,我应该在ID3D10Device接口上调用Release吗?为什么?

时间:2012-01-18 19:48:58

标签: c++ memory-management com directx

我在directx10项目中使用此代码。

ID3D10Texture2D *depthStencilBuffer;
UINT a = m_device->Release();
if(FAILED(hr = m_device->CreateTexture2D( &descDepth, NULL, &depthStencilBuffer ))) {
    DXGI_D3D10_ErrorExit(hr, L"CreateTexture2D");
    return hr;
}
a = m_device->Release();

现在,如果我在第三行停止调试器并检查a的值,它会显示2.当我在最后一行之后停止它时,它会说3.我不明白为什么。 CreateTexture2D函数是否添加了对ID3D10Device接口的引用?而且显然它甚至没有添加一个引用,而是添加了两个引用,因为Release()减少了一个引用。 我的问题是ID3D10Device::CreateTexture2D的文档没有指定它添加对ID3D10Device对象的引用。例如,ID3D10Device::CreateRenderTargetView也是如此。我该如何猜测何时拨打Release

1 个答案:

答案 0 :(得分:2)

我没有能力安装DirectX SDK来测试它,但是,在一般原理中,当涉及到COM时,你应该遵循COM规则并相信其他对象也遵循规则。

即。你不应该知道Texture2D的实现,但你应该相信,如果它需要添加对设备的引用,它也会在完成后删除它们。您不应该尝试对Release()进行额外调用。

您的代码应为:

ID3D10Texture2D *depthStencilBuffer = NULL;
if(FAILED(hr = m_device->CreateTexture2D( &descDepth, NULL, &depthStencilBuffer ))) {
    DXGI_D3D10_ErrorExit(hr, L"CreateTexture2D");
    return hr;
}
depthStencilBuffer->Release();
depthStencilBuffer = NULL;

即。你应该期望调用返回一个引用计数为1的texture2d,这就是你需要知道的。当你完成后,你应该只在depthStencilBuffer上调用release,并期望它完全自我清理。如果在实现过程中模板缓冲区需要对设备的引用,您应该相信它也会正确调用这些引用的释放。