我如何将 shared_ptr<ID3D11Buffer> 转换为 ID3D11Buffer**

how would i convert shared_ptr<ID3D11Buffer> to ID3D11Buffer**

这个函数需要 **ID3D11Buffer (其中 vertexBuffer.get() 当前是 )。我有以下代码:

shared_ptr<ID3D11Buffer> vertexBuffer;
this->graphicContext->GetDevice()->CreateBuffer( &bd, &srd, vertexBuffer.get() );

argument of type "ID3D11Buffer *" is incompatible with parameter of type "ID3D11Buffer **"

我如何获得指向指针的指针? vertexBuffer.get()只是returns一个指针

不清楚 CreateBuffer 的语义是什么,也不清楚为什么要向它传递一个已经存在的缓冲区。

ID3D11Buffer* buf = vertexBuffer.get();
this->graphicContext->GetDevice()->CreateBuffer( &bd, &srd, &buf);
if (buf != vertexBuffer.get())
    vertexBuffer = new shared_ptr<ID3D11Buffer> (buf);

这需要 ID3D11Buffer 拥有一个取得 ID3D11Buffer * 所有权的构造函数。如果没有它,这只会在函数从不创建缓冲区并且只需要一个 ID3D11Buffer ** 的情况下起作用,这样它就可以在一个不存在的情况下创建一个。

您必须将缓冲区获取为原始指针:

ID3D11Buffer* vbptr;
HRESULT hr = this->graphicContext->GetDevice()->CreateBuffer( &bd, &srd, &vbptr);
IF(FAILED(hr))
{
    // an error occurred...
}

然后使用调用 Release:

的自定义删除器将其正确分配给 shared_ptr
std::shared_ptr<ID3D11Buffer> vertexBuffer(vbptr, &ID3D11Buffer::Release);