Gerenciamento de memória para componentes .NET usados por código não gerenciado
-
08-07-2019 - |
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?
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.