Tenho de chamar uma função de libertação usando um ComPtr?

Estou a usar um ponteiro inteligente ou um ComPtr. Estou a usá-lo com a minha aplicação directX e não vi outras pessoas ligarem para a função de libertação no seu código usando o ComPtr. Então o ponteiro inteligente libera os dados que o ponteiro inteligente está se referindo ou eu preciso fazê-lo manualmente? Eu não sei se isso faz desde então me diga se não faz e eu vou responder com mais detalhes.

Author: CPlusPlusProgrammer, 2016-03-21

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.

Como com todos apontadores inteligentes {[[30]} você deve pensar sobre o tempo de vida do seu apontador para decidir como usá-lo. Se uma função ou classe está indo para 'possuir' o objeto apontado para, então o uso de um ponteiro inteligente é a maneira correta de fazê-lo. Se a função apenas vai funcionar com o objeto e então retornar sem qualquer mudança na vida, a função deve tomar um ponteiro raw em vez disso com você usando o método Get no ComPtr ao chamá-lo. Caso contrário, o seu programa desperdiça muito tempo desnecessariamente aumentando e diminuindo a contagem de ref-quando a propriedade do objeto não estava realmente em questão.

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 usar std::shared_ptr e std::weak_ptr mas há um monte de implicações de desempenho e edge-cases para se preocupar com o caso compartilhado, por isso aderir a ComPtr para COM e std::unique_ptr para objetos alocados heap com um único proprietário é a melhor prática.

 2
Author: Chuck Walbourn, 2016-03-22 18:14:07

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).

 1
Author: user253751, 2016-03-21 23:52:32