Pergunta

Se tiver uma classe C ++, X, que implementa a interface COM ly e lz, e que tem um ponteiro y para a interface IY de um objecto do tipo X, e eu fazer esta:

IZ *z = dynamic_cast<IZ *> ( y );

Isso não bata contagem de referência do objeto, não é? Eu não tenho que fazer um Release () para a conta para ele, certo?

Se é importante, eu estou usando ATL / COM.

Eu estou supondo que a resposta é "não, não bata a contagem de referência, e não você não tem que Release ()", mas eu quero ter certeza.

Agradecemos antecipadamente.

Foi útil?

Solução

contagens de referência para objetos COM são incrementados quando alguém chama IUnknown :: AddRef (). QueryInterface (), de acordo com as regras do COM, uma vez que dá um novo ponteiro interface, internamente chama AddRef ().

Em seu código publicado, você não está chamando AddRef () e você não está chamando qualquer função que poderíamos chamar AddRef (), então por que você acha que a contagem de referência seria incrementado?

Apesar do que ATL / MFC faz para o cérebro de um, não há mágica envolvida. Em caso de dúvida, pode sempre ver a desmontagem na VS e passo por ela e provar para si mesmo que AddRef () não está sendo chamado.

Edit: E eu quero reiterar o que Dewfy disse, não fazer isso . Use QueryInterface (). Ou CComQIPtr <> (se você realmente deve).

Além disso edit: Se você usar CComPtr <> e CComQIPtr <>, em seguida, você não tem que chamar Release () e grande parte da carga de descobrir o ref contagem adequada é aliviado. Você realmente deve considerar a usá-los.

Outras dicas

dynamic_cast não deve ser usado em várias razões:

  • Você não sabe se suportes de destino RTTI
  • Você não tem certeza se OLE não cria proxy para você
  • ...

Em vez disso usar QueryInterface -. Que seria feito o que você quer

Mesmo se você certeza na pergunta acima - fundição não muda refcounter

Em C ++ Builder, dynamic_cast em um ponteiro de interface COM realmente faz QueryInterface. e o ponteiro retornado, se o QI-sucedido, fica AddRef'd.

As classes que implementam objetos COM têm diferentes layouts vtable para C ++ mais geral aulas, portanto, um C ++ - estilo dynamic_cast não pode trabalhar; então eu presumo que é por isso C ++ Builder faz a coisa mais sensata de fazer QueryInterface.

(A idéia original do COM foi a generalizar o modelo C ++ objeto a ser língua agnóstico e um padrão binário; eles rebatizado dynamic_cast para QueryInterface).

Eu acho que a resposta de topo está se referindo a MSVC, se dynamic_cast provoca um comportamento indefinido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top