DX12代码中GetAddressOf与&运算符的使用差异解析
为什么ComPtr的传递方式不一样?
先明确ComPtr两种操作的核心区别:
- 使用
&mCommandQueue时,调用的是ComPtr重载的operator&。这个重载会先释放ComPtr当前持有的COM对象(如果存在),再返回内部原始指针的地址,给Create系列函数使用时,能避免旧指针未释放导致的内存泄漏。 - 调用
GetAddressOf()则是直接返回内部原始指针的地址,不会自动释放当前持有的对象。如果此时ComPtr已经持有对象,直接传递这个地址给创建函数,旧对象的指针会被覆盖,进而造成内存泄漏。
回到代码场景:
这三个ComPtr在调用Create函数前都是未初始化的空状态,所以两种写法实际效果一致。Frank Luna这里混用,大概率是为了展示两种传递方式的用法,或是个人编码习惯。
需要注意的是:如果ComPtr已持有对象,用&更安全,它会自动清理旧对象;而GetAddressOf()需谨慎使用,必须确保当前ComPtr为空,或是你已手动释放了旧对象。
内容的提问来源于stack exchange,提问作者Francisco José Letterio
相关产品推荐
相关产品推荐

