Gerenciamento de memória: alocação do quadro
A alocação no quadro usa seu nome do "registro de ativação" que é configurado sempre que uma função é chamada. O registro de ativação é uma área de memória que contém temporariamente os argumentos para a função, bem como todas as variáveis definidas localmente para a função. As variáveis de quadro geralmente são chamadas de variáveis "automáticas", pois o compilador aloca automaticamente o espaço para elas.
Há duas características principais de alocações de quadro. Primeiro, quando você define uma variável local, espaço suficiente é alocado no registro de ativação para manter toda a variável, mesmo que seja uma grande matriz ou estrutura de dados. Em segundo lugar, as variáveis de quadro são excluídas automaticamente quando saem do escopo:
void MyFunction()
{
// Local object created on the stack
CString strName;
// Object goes out of scope and is deleted as function ends
}
Para variáveis de função local, essa transição de escopo acontece quando a função é encerrada, mas o escopo de uma variável de quadro pode ser menor que uma função se chaves aninhadas forem usadas. Essa exclusão automática de variáveis de quadro é muito importante. No caso de tipos primitivos simples (como int
ou bytes), matrizes ou estruturas de dados, a exclusão automática simplesmente recupera a memória usada pela variável. Como a variável saiu do escopo, ela não pode ser acessada de qualquer maneira. No caso de objetos C++, no entanto, o processo de exclusão automática é um pouco mais complicado.
Quando um objeto é definido como uma variável de quadro, seu construtor é invocado automaticamente no ponto em que a definição é encontrada. Quando o objeto sai do escopo, seu destruidor é automaticamente invocado antes que a memória do objeto seja recuperada. Essa construção e destruição automáticas podem ser muito úteis, mas você precisa estar ciente das chamadas automáticas, especialmente para o destruidor.
A principal vantagem de alocar objetos no quadro é que eles são excluídos automaticamente. Quando você aloca seus objetos no quadro, não precisa se preocupar com objetos esquecidos que causam perda de memória. (Para obter detalhes sobre perdas de memória, consulte o artigo Detectando perdas de memória no MFC.) Uma desvantagem da alocação de quadros é que as variáveis de quadro não podem ser usadas fora do escopo. Outro fator na escolha da alocação de quadro em relação à alocação de heap é que, para grandes estruturas e objetos, geralmente é melhor usar o heap em vez da pilha para armazenamento, uma vez que o espaço de pilha geralmente é limitado.