Tenho de chamar uma função de libertação usando um ComPtr?
2 answers
Você nunca deve ligar para {[[0]} ou Release
para um {[[2]}, e por omissão não pode. você tem que usar padrões hacky como comPtr.Get()->Release
para fazê-lo, e você é principalmente como se fosse causar problemas.
O objectivo de Microsoft::WRL::ComPtr
é fazer com que a limpeza COM pointer seja automática, tanto em código normal como ao lidar com excepções em C++. Fazer uma cópia de um ComPtr para outro ComPtr automaticamente aumenta a contagem de ref, e cada vez que uma variável ComPtr sai do escopo ele automaticamente diminui a contagem de ref. Presente simplifica muito o tratamento de erros e a limpeza, razão pela qual o código que está a ver não está inundado de chamadas para Release
.
Existem métodos especiais Attach
e Detach
para a "transferência de propriedade" de modo a que a contagem não seja alterada, mas são para casos especiais de uso. Há também alguns truques que você pode fazer com Swap
bem como que são muito úteis para a codificação robusta.
Se você quiser explicitamente 'release' uma variável ComPtr, você pode atribuir nulo a ela ou melhor ainda usar Reset
.
Outra opção é passar o parâmetro smart-pointer como {[11] } o que evita o ciclo de contagem de refl, mas tem o efeito colateral de forçar o chamador a usar ComPtr
quando o ponteiro bruto é mais agnóstico para a Política de vida do objeto do chamador e, portanto, mais flexível.
Tenho um registo de como usar o ... DirectX Tool Kit wiki . Você também pode ver MSDN .
Para objectos não COM,
std::unique_ptr
é uma óptima opção. Você também pode usarstd::shared_ptr
estd::weak_ptr
mas há um monte de implicações de desempenho e edge-cases para se preocupar com o caso compartilhado, por isso aderir aComPtr
para COM estd::unique_ptr
para objetos alocados heap com um único proprietário é a melhor prática.
Normalmente não é necessário ligar para {[[0]} ou Release
através do ponteiro inteligente-o ponto inteiro de ComPtr
é que ele chama aqueles para você.
Você ainda pode precisar chamá-los se você está convertendo um ponteiro inteligente para um ponteiro "manejado manualmente" (normal).