Compartilhar via


Regras de gerenciamento de memória

O tempo de vida de ponteiros para interfaces é sempre gerenciado por meio dos métodos AddRef e Release em cada interface COM. Para obter mais informações, consulte Rules for Managing Reference Counts.

Para todos os outros parâmetros, é importante aderir a determinadas regras para gerenciar a memória. As regras a seguir se aplicam a todos os parâmetros de métodos de interface" incluindo o valor retornado que não são passados por valor:

  • Os parâmetros devem ser alocados e liberados pelo chamador.
  • Os parâmetros externos devem ser alocados pelo chamado; eles são liberados pelo chamador usando o alocador de memória de tarefa COM padrão. Consulte o alocador de memória OLE para obter mais informações.
  • Os parâmetros inicialmente são alocados pelo chamador e liberados e realocados pelo chamado, se necessário. Como é verdadeiro para parâmetros externos, o chamador é responsável por liberar o valor retornado final. O alocador de memória COM padrão deve ser usado.

Nos dois últimos casos, em que uma parte do código aloca a memória e uma parte diferente do código a libera, o uso do alocador COM garante que as duas partes do código estejam usando os mesmos métodos de alocação.

Outra área que precisa de atenção especial é o tratamento de parâmetros de entrada e saída em condições de falha. Se uma função retornar um código de falha, o chamador normalmente não terá como limpar os parâmetros de saída ou de entrada. Isso leva às seguintes regras adicionais:

  • No caso de uma condição de erro, os parâmetros devem ser sempre definidos de forma confiável para um valor que será limpo sem nenhuma ação do chamador.
  • Todos os parâmetros de ponteiro externo devem ser definidos explicitamente como NULL. Eles geralmente são passados em um parâmetro ponteiro a ponteiro, mas também podem ser passados como membros de uma estrutura que o chamador aloca e o chamado preenchimento de código. A maneira mais simples de garantir isso é (em parte) definir esses valores para NULL na entrada da função. Essa regra é importante porque promove uma interoperabilidade de aplicativo mais robusta.
  • Em condições de erro, todos os parâmetros in-out devem ser deixados sozinhos pelo código chamado (permanecendo, portanto, no valor para o qual foram inicializados pelo chamador) ou ser definidos explicitamente, como no caso de retorno de erro do parâmetro out.

Lembre-se de que essas convenções de gerenciamento de memória para aplicativos COM se aplicam somente em interfaces públicas e APIs; não há nenhum requisito de que a alocação de memória estritamente interna para um aplicativo COM precise ser feita usando esses mecanismos.

O COM usa internamente as RPC (Chamadas de Procedimento Remoto) para se comunicar entre clientes e servidores. Para obter mais informações sobre como gerenciar memória em stubs de servidor RPC, consulte o tópico Gerenciamento de Memória de stub do servidor tópico.