Regras de Gerenciamento de Memória
O tempo de vida dos ponteiros para as interfaces é sempre gerenciado por meio dos métodos AddRef e Release em cada interface COM. Para obter mais informações, confira Regras para Gerenciar Contagens de Referência.
Para todos os outros parâmetros, é importante aderir a determinadas regras de gerenciamento de memória. As regras a seguir se aplicam a todos os parâmetros dos métodos de interface, inclusive o valor de retorno, que não são passados por valor:
- Os parâmetros internos devem ser alocados e liberados pelo chamador.
- Os parâmetros externos devem ser alocados por quem foi 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 de entrada/saída são inicialmente alocados pelo chamador e, em seguida, liberados e realocados pelo chamado, se necessário. Como acontece com os parâmetros de saída, o chamador é responsável por liberar o valor final retornado. O alocador de memória COM padrão deve ser utilizado.
Nos dois últimos casos, em que uma parte do código aloca a memória e outro parte do código a libera, o uso do alocador COM garante que s duas partes do código estejam usando os mesmos métodos de alocação.
Outra área que precisa de atenção especial é o tratamento dos parâmetros de saída e entrada 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 entrada. Isso leva às seguintes regras adicionais:
- No caso de uma condição de erro, os parâmetros sempre devem ser definidos de forma confiável para um valor que será limpo sem nenhuma ação do chamador.
- Todos os parâmetros do ponteiro de saída devem ser explicitamente definidos como NILO. Geralmente, eles 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 código chamado preenche. A maneira mais direta de garantir isso é (em parte) definir esses valores como NULO na entrada da função. Essa regra é importante porque promove uma interoperabilidade de aplicativos mais robusta.
- Em condições de erro, todos os parâmetros de entrada e saída devem ser deixados de lado pelo código chamado (permanecendo, portanto, com o valor para o qual foram inicializados pelo chamador) ou devem ser explicitamente definidos, como no caso de retorno de erro de parâmetro de saída.
Lembre-se de que essas convenções de gerenciamento de memória para aplicativos COM se aplicam apenas a interfaces e APIs públicas; não há nenhuma exigência de que a alocação de memória estritamente interna a um aplicativo COM precise ser feita usando esses mecanismos.
O COM usa internamente as Chamadas de Procedimento Remoto (RPC) para se comunicar entre clientes e servidores. Para obter mais informações sobre o gerenciamento de memória em stubs de servidor RPC, confira o tópico Gerenciamento de memória de stubs de servidor.