Pergunta

Ao trabalhar no mundo não gerenciado, precisamos garantir que nos limpemos depois de nós se tivermos alocados a memória na pilha (por exemplo, usando o new palavra -chave em c ++); Também temos que ter certeza de que nós AddRef Componentes com que são criados usando CreateInstance e para Release mais tarde; Talvez algo como:

SomeNameSapce::IObjPtr obj;
HRESULT hr = obj.CreateInstance(L"SomeObject");
if (hr == S_OK)
{
    obj->AddRef();
    m_anotherObj= obj->GetObj();
    obj->Release();
}

Obviamente, poderíamos usar ponteiros inteligentes e outras coisas (em C ++), mas isso está além do ponto ...

Também temos que AddRef/Release Para objetos que são capturados de componentes com (como m_anoterobj no exemplo acima)?

Para tornar as coisas mais confusas, o que acontece se esse componente específico é realmente um componente .NET que está sendo exposto ao código não gerenciado por meio de uma interface COM? O coletor de lixo sabe esclarecer as coisas ou tudo precisa ser feito manualmente no mundo não gerenciado?

Foi útil?

Solução

CreateInstance devolverá um objeto com uma contagem de referência de 1, então você não precisa AddRef isto. (O ponteiro inteligente que você usou Release o objeto quando é destruído.) Da mesma forma, os objetos que você recebe dos métodos devem ter a contagem de referência já incrementada, para que você não precise AddRef eles novamente - mas você precisa Release eles, a menos que você esteja usando um ponteiro inteligente.

Os componentes com expostos pelo .NET não são diferentes dos componentes com escritos por qualquer outra tecnologia. O coletor de lixo não coletará nenhum objetivo .NET referenciado nas referências COM.

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