簡體   English   中英

WRL::ComPtr 導致 d3d 中的 object 泄漏?

[英]WRL::ComPtr causes object leaks in d3d?

我正在制作一個簡單的 d3d 11 應用程序,並且正在使用 Microsoft::WRL::ComPtr 自動釋放資源。 出於某種原因,盡管當應用程序退出時,我從 d3d 收到 30-40 條 Live Object 警告。 我可能會錯過一兩個,但這似乎更像是我擁有的所有對象的計數。 我顯然做錯了什么。 我的一般用法是在一些包裝器 class 中有一個成員:

class graphics_device
{
   // ...
   ComPtr<ID3D11Device> hwdevice;
}

理論上應該在 class 破壞時釋放 object。 (我在堆棧上創建了大多數對象,並且我仔細檢查了我是否刪除了堆上的對象)

當我創建我的功能時,我將它們作為參考傳遞。 例如:

void graphics_device::create_constant_buffer(u32 size, const void* data, ComPtr<ID3D11Buffer>& constantBuffer)
{
    D3D11_BUFFER_DESC bufferDesc;
    ZeroMemory(&bufferDesc, sizeof(bufferDesc));

    bufferDesc.Usage = D3D11_USAGE_DEFAULT;
    bufferDesc.ByteWidth = size;
    bufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
    bufferDesc.CPUAccessFlags = 0;

    D3D11_SUBRESOURCE_DATA initData;
    ZeroMemory(&initData, sizeof(initData));
    initData.pSysMem = data;

    device->CreateBuffer(&bufferDesc, &initData, &constantBuffer);
}

有什么我想念的想法嗎?

編輯:忘記發布來自 d3d11 的警告:

D3D11 WARNING:  Live Object at 0x0061D93C, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING:  Live Object at 0x0061DBE4, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING:  Live Object at 0x0061DE8C, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D11 WARNING: Live                         Object :     31 [ STATE_CREATION WARNING #0: UNKNOWN]
DXGI WARNING: Live Producer at 0x005ADDC0, Refcount: 4. [ STATE_CREATION WARNING #0: ]
DXGI WARNING:   Live Object at 0x005B7FD0, Refcount: 2. [ STATE_CREATION WARNING #0: ]
DXGI WARNING: Live                         Object :      1 [ STATE_CREATION WARNING #0: ]

還有更多類似的。 在運行時我沒有收到任何其他警告。

獲得一個“干凈的出口”可能有點挑戰。 如果使用正確,它不太可能是ComPtr 根據評論,一個好的起點是object 命名 請記住 output 發生在 Direct3D 設備發布時,因此您可能需要查看“發布順序”以使其干凈退出。 還有“內部”與“外部”參考計數,因此它們可能會有些混亂。 有關調試層使用的一些說明,請參閱此博客文章

要記住的另一件事是 Direct3D object 報告不能真正告訴您有關 DXGI 擁有的對象的信息。 這就是為什么使用DXGI 調試設備也很有用的原因。

directx-vs-templates將這些博客文章中的所有建議放在一個地方,因此您可能需要查看它們。

最后,將ComPtr作為參數傳遞通常不是最好的用例,即使是通過引用也是如此。 使用ComPtr作為數據成員和局部變量很好,但通常作為參數最好使用“原始指針”,因為生命周期已經是隱式的。 所以你的 function 簽名會更好:

void graphics_device::create_constant_buffer(u32 size, const void* data, ID3D11Buffer** constantBuffer);

然后在調用 function 時,您使用ComPtr

ComPtr<ID3D11Buffer> cb;
graphicsdevice->create_constant_buffer(size, data, &cb);

有關最有效地使用它的一些提示,請參閱ComPtr 上的這個 wiki

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM