Partilhar via


Gerenciamento de memória com o empacotador de interoperabilidade

O empacotador de interoperabilidade sempre tenta liberar a memória alocada pelo código não gerenciado. Esse comportamento está em conformidade com regras de gerenciamento de memória COM, mas difere as regras que governam o C++ nativo.

Confusão pode surgir se você prevê que o comportamento de C++ nativo (não liberar memória) quando usando platform invoke, que automaticamente libera a memória para ponteiros. Por exemplo, chamar o seguinte método não gerenciado a partir de uma DLL do C++ não automaticamente qualquer memória livre.

Assinatura não gerenciada

BSTR MethodOne (BSTR b) {
     return b;
}

No entanto, se você definir o método como uma plataforma de invocar o protótipo, substitua cada BSTR digite com um String tipo e a chamada MethodOne, o common language runtime tenta liberar b duas vezes. Você pode alterar o comportamento de empacotamento usando IntPtr tipos em vez de seqüência de caracteres tipos.

O runtime sempre usa o CoTaskMemFree método para liberar memória. Se a memória que você estiver trabalhando com não foi alocada com o CoTaskMemAlloc método, você deve usar um IntPtr e liberar a memória manualmente usando o método apropriado. Da mesma forma, você pode evitar automático de memória liberando em situações onde memória nunca deve ser liberada, tal como ao usar o GetCommandLine a função de Kernel32. dll, que retorna um ponteiro para a memória do kernel. Para obter detalhes sobre a liberação de memória manualmente, consulte o Buffers de amostra.

Consulte também

Conceitos

Atributos direcionais

Blittable e tipos de não-Blittable

Copiando e fixando

Outros recursos

Comportamento de empacotamento padrão