我在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
?
答案 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,并期望它完全自我清理。如果在实现过程中模板缓冲区需要对设备的引用,您应该相信它也会正确调用这些引用的释放。