Guionardo Furlan wrote:
> TReg = record
> private
>   FInicializado: Boolean;
>   FData: array of string;
>   function GetCount: Integer;
>   function SetCount(const Value: Integer);
> public
>   property Count: Integer read GetCount write SetCount;
>   property Data[Index: Integer] read GetData write SetData;
> end;
> <snip>
> 1. Quando eu defino uma variável com o tipo TReg, o campo FInicializado
> Booleano é *sempre* criado como False?

Ao instanciar uma classe, sim. Record eu me arrisco a dizer que não, uma 
vez que ele não tem uma rotina de inicialização como uma classe.

Se a variável desse record for global, possivelmente ele será 
inicializado. Se for dentro de uma procedure, function ou method, mais 
provável que não.

> 2. Após vários processos em que o tamanho da array de strings FData é
> modificado, pode ocorrer vazamento de memória?

Não. Array dinâmico possui contagem de referência e ele é destruído tão 
logo saia de escopo, assim como acontece com ansi strings.

> Num sistema, criei um record similar a este, e depois disso, começaram a
> aparecer mensagens do FastMM falando sobre vazamento de memória com tipos
> string, que não estou conseguindo identificar.

Você cria alguma coisa dinamicamente, tal como instância de classes ou 
através da procedure new? Talvez a string esteja em um array, e este 
array esteja associado a alguma outra área de memória, tal como um 
objeto ou uma variável dinâmica?

> No NG, recebi dicas para utilizar classes ao invés de records, mas foi o que
> me pareceu mais econômico, já que as variáveis record serão acessadas
> localmente, dentro de outras classes.

A única economia ao utilizar record é não precisar instanciar, e seus 
métodos receberem um parâmetro a menos (que no caso da classe é o 
ponteiro da instância) mas será que realmente vale a economia?

Joao Morais

Responder a