[英]Should I call Release on a ID3D10Device interface after using CreateTexture2D? why?
我在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.当我最后一个后在该行停止它,它说。我不明白为什么。 CreateTexture2D
函数是否添加了对ID3D10Device
接口的引用? 显然它甚至没有添加一个引用,但是因为Release()
减少了一个而引入了两个引用。 我的问题是ID3D10Device::CreateTexture2D
的文档没有指定它添加对ID3D10Device
对象的引用。 例如,对于ID3D10Device::CreateRenderTargetView
也是如此。 我该如何猜测何时拨打Release
?
我没有能力安装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,并期望它完全自我清理。 如果在实现过程中模板缓冲区需要对设备的引用,您应该相信它也会正确调用这些引用的释放。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.