在这篇文章中
d3d(Direct X)中的com技术详解_杀神李的博客-CSDN博客
我们已经学会了d3d中的com技术,现在让我们继续学习comptr
上文中我们说到,所有基于com技术的类都必须继承基类IUnknown,该类中有三个接口
AddRef():增加引用计数
Release():减少引用计数
QueryInterface():用来检查是否可以做向下转型的
但是新版的C++都提倡使用RAII管理内存,即通过临时对象,构造的时候申请内存,析构的时候自动释放所申请的内存,而不需要程序员手动使用如delete IUnknown中的Release等函数来释放内存
Tips:智能指针便是这种思想
所以微软也推出了专门基于com技术的智能指针,名字叫做comptr,让你能够用对象来管理申请的内存资源,这个指针就是 Microsoft::WRL::ComPtr
熟悉智能指针的小伙伴其实很快就能上手 接下来让我们来看看他的接口
方法 | 描述 |
ComPtr::Get | 该方法返回T*,并且不会触发引用计数加1,常用在COM组件接口的函数输入 |
ComPtr::GetAddressOf | 该方法返回T**,常用在COM组件接口的函数输出 |
ComPtr::Reset | 该方法对里面的实例调用Release方法,并将指针置为nullptr |
ComPtr::ReleaseAndGetAddressOf | 该方法相当于先调用Reset方法,再调用GetAddressOf方法获取T**,常用在COM组件接口的函数输出,适用于实例可能会被反复构造的情况下 |
ComPtr::As | 一个模板函数,可以替代IUnknown::QueryInterface的调用,需要传递一个ComPtr实例的地址 |
所以,基于ComPtr管理内存后,我们的初始化代码就可以写成如下形式了:
Microsoft::WRL::ComPtr<ID3D12Device> md3dDevice;
D3D12CreateDevice(
pWarpAdapter.Get(),
D3D_FEATURE_LEVEL_11_0,
__uuidof(ID3D12Device),md3dDevice.GetAddressOf());
//不用手动释放内存,接下来可以直接使用md3dDevice进行接口调用了