Delphi gerencia automaticamente a memória
Variáveis atômicas em Delphi, como Inteiro, Booleano, Registro, Enumeração, etc., são alocadas automaticamente pelo compilador para memória dentro do escopo e liberadas automaticamente quando fora do escopo. Além disso, strings, variantes, matrizes dinâmicas e interfaces. também são gerenciados automaticamente pelo Delphi.
Essas variáveis são todas armazenadas na pilha , exceto as interfaces. Além disso, Variant é criado manualmente por programadores usando funções, como VarArrayCreate. Matrizes dinâmicas também são criadas manualmente por programadores usando funções, como SetLength, mas em ambos os casos, os próprios programadores não precisam liberá-lo.
Além disso, há outro tipo de variável que precisa ser observado, que é uma variável declarada usando Threadvar, e seu escopo é um thread. Isso é usado principalmente ao escrever funções encadeadas, de modo que cada encadeamento use um armazenamento local de encadeamento.
Memória gerenciada manualmente por programadores
Ponteiros e objetos exigem que os programadores solicitem e liberem memória manualmente.
Os ponteiros incluem PChar, ponteiro (ponteiro não digitado), ponteiro de registro, ponteiro variável (apontando para variável atômica), ponteiro de função (como função de retorno de chamada, dividida em funções globais e métodos de objeto). Use a função New para solicitar memória e use Dispose para liberar o ponteiro. Além disso, GetMem, ReallocMem e FreeMem também são uma série de funções para solicitar e liberar memória. Você pode ler e definir as três funções de gerenciamento de memória do Delphi por meio das funções GetMemoryManager e SetMemoryManager.
Os objetos incluem objetos de subclasse herdados de duas árvores de herança, TObject e IUnknown. Os objetos devem ser construídos usando métodos construtores. Se você não especificar um proprietário para um objeto criado usando o método construtor (geralmente Create, mas pode não ser o caso; o compilador do Delphi reconhece apenas a palavra-chave construtor), você mesmo deverá liberá-lo manualmente. você ainda precisa verificar a situação real. Ela precisa ser divulgada em um momento específico. Geralmente, o método Free é usado para liberação (IUnknown não requer liberação manual). Um método melhor é usar FreeAndNil (na unidade Sysutils.pas), que não apenas libera a memória ocupada, mas também libera o próprio ponteiro.
Essas variáveis são armazenadas no heap . Outra questão que precisa de atenção é que os ponteiros no TList precisam ser liberados pelo próprio programador.
Observação:
1. A função de retorno de chamada não pertence ao escopo técnico de gerenciamento de memória. Para obter detalhes, consulte a seção "Ponteiro".
2. Para obter detalhes sobre o objeto, consulte a seção "Modelo de Objeto".
3. Se um ponteiro for usado em vários locais, e se um dos locais for liberado, ocorrerá uma exceção se for usado em outros locais. Este é um problema ao qual devemos prestar atenção ao usar ponteiros. Para obter informações detalhadas sobre a memória, consulte a seção "Ponteiro".
4. Passar ponteiros tem duas vantagens óbvias: economizar memória e melhorar a velocidade. Para obter informações detalhadas sobre memória, consulte as seções "Ponteiros" e "Dicas de design".
5. Como julgar objetos e ponteiros é um tópico muito técnico. Existem algumas postagens sobre esse tópico no csdn. Você também pode ver um artigo escrito por Aimingoo ([email protected]) intitulado "Sobre" como detectar se um ponteiro. é o artigo "Discussão aprofundada do objeto". Para obter informações detalhadas sobre memória, consulte as seções "Ponteiro" e "Objeto".
Concluído em 19/01/2004 .
Todos os direitos reservados. Sinta-se à vontade para corrigir quaisquer comentários inadequados.