【问题标题】:Why does function of ComPtr return a different value then &?为什么 ComPtr 的函数返回的值与 & 不同?
【发布时间】:2020-04-28 21:39:59
【问题描述】:

为什么是 &(ComPtr.Get()) != ComPtr.GetAddressOf()?

我尝试将 ID3D11ShaderResourcesView* 传递给函数并将其转换为 ** 以在 CreateShaderResourceView 中使用,但它没有正确工作。

我意识到,3个参数的问题。

【问题讨论】:

  • 我有一篇关于使用 ComPtr here 的快速文章,您可能会觉得有用。

标签: c++ com directx


【解决方案1】:

您正在获取ComPtr.Get() 返回的指针的地址。这与指向对象的指针完全不同。

【讨论】:

  • 我认为 Get() 返回一个指向该对象的指针,而 GetAddressOf() 返回一个指向该指针的指针。在文档中,它描述为“T* Get() const;”和“T** GetAddressOf();” docs.microsoft.com/ru-ru/cpp/cppcx/wrl/…
  • 哦,我明白了。谢谢!
【解决方案2】:

ComPtr.Get() 按值返回持有的指针,因此&(ComPtr.Get()) 正在获取持有的指针的副本的地址。

ComPtr.GetAddressOf() 返回持有指针本身的地址,而不是它的副本。

如果ComPtr.Get() 通过引用返回了持有的指针,那么&(ComPtr.Get()) 将采用原始指针的地址,而不是副本。但它不返回引用。

【讨论】:

  • 我可以问更多吗?我解开了它,但我还没有理解其他事情。 “T CreateShaderResourceView(...)”需要 3 个参数。首先是指向对象的指针,它与父对象相连。第二无所谓。第三个是指向对象的指针。为什么我不能在这里使用 &(ComPtr.Get()) 作为 3 参数?我的意思是,保存指向对象的指针的位置并不重要,它必须是钢铁般的工作。函数具有到对象的类似路径。和我想的一样。
  • @Кай CreateShaderResourceView() 通过设置在第三个参数中传递的指针返回一个新对象。正如我所说,ComPtr.Get() 返回ComPtr 持有的指针的副本。因此&(ComPtr.Get()) 采用副本 的地址,而不是原始地址。分配给副本的任何值都不会分配给原件。这就是为什么&(ComPtr.Get())不适合和CreateShaderResourceView()一起使用,你需要用ComPtr.GetAddtessOf()代替,这样CreateShaderResourceView()可以更新ComPtr持有的原始指针。
  • 哦,真是个严重的错误。它不会更改对象,它会更改指向对象的指针 =_=" Mb 我需要休息)谢谢!
猜你喜欢
  • 2014-11-02
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多