我需要将ID3D11RenderTargetView指针的地址传递给一个函数,并使用com_ptr_t来保存它。所以首先我尝试:
ID3D11RenderTargetViewPtr pRenderTargetView; = ID3D11RenderTargetViewPtr(NULL);
pImmediateContext->OMSetRenderTargets(1, &pRenderTargetView, nullptr);
但是,& 运算符将指针转换为 null。然后我再次浏览了com_ptr_t函数,发现我可以写:
pImmediateContext->OMSetRenderTargets(1, &pRenderTargetView.GetInterfacePtr(), nullptr);
它确实有效,但是没有更简单的方法可以在不丢失基础指针的情况下获取它吗?更简单,我的意思是更短,语法明智。
伊戈尔的评论是正确的。 _com_ptr_t
的目的非常简单,对原始接口指针的简单转换几乎总是错误的做法。
例如,&
运算符释放接口的主要原因是,人们获取智能指针地址的首要原因是将其作为out参数传递给某个工厂函数。 如果&
没有释放指针,则旧值将泄漏。
这种情况发生了很多。
现在,有更罕见的情况,例如您拥有的那种,您将接口的地址传递给不会设置它的函数,在这些情况下,您拥有 GetInterfacePtr 函数。