Pergunta

Eu sou novo para Delphi, e eu tenho corrido alguns testes para ver o que variáveis ??de objeto e variáveis ??de pilha são inicializados por padrão:

TInstanceVariables = class
  fBoolean: boolean; // always starts off as false
  fInteger: integer; // always starts off as zero
  fObject: TObject; // always starts off as nil
end;

Este é o comportamento que eu estou acostumado a de outras línguas, mas eu estou querendo saber se é seguro confiar nele em Delphi? Por exemplo, eu estou querendo saber se ele pode depender de um ambiente de compilador, ou talvez trabalhar de forma diferente em diferentes máquinas. É normal que confiar em valores padrão inicializado para objetos, ou você definir explicitamente todas as variáveis ??de instância no construtor?

Quanto a pilha (procedimento de nível) variáveis, meus testes estão mostrando que booleans não inicializado são verdadeiras, inteiros não inicializado é 2129993264, e objetos uninialized são apenas ponteiros inválidos (ou seja, não nulo). Eu estou supondo que a norma é sempre definido variáveis ??de nível de procedimento antes de acessá-los?

Foi útil?

Solução

Sim, este é o comportamento documentado:

  • campos de objeto são sempre inicializados a 0, 0,0, '', False, nil ou o que se aplica.

  • As variáveis ??globais são sempre inicializados a 0, etc, bem;

  • variáveis ??* contados de referência locais são sempre inicializados a zero ou '';

  • variáveis ??* contados de referência não locais são não inicializado então você tem que atribuir um valor antes que você possa usá-los.

Eu me lembro que Barry Kelly algum lugar escreveu uma definição de "referência-contados", mas não consegue encontrá-lo qualquer mais, por isso deve fazer nesse meio tempo:

referência-contados == que são contadas referência a si mesmos, ou directamente ou indirectamente conter campos (por registos) ou elementos (por matrizes) que são contadas como referência: string, variant, interface ou matriz dinâmica ou array estático que contém tais tipos.

Notas:

  • próprio record não é suficiente para se tornar contados referência
  • Eu não tentei isso com os genéricos ainda

Outras dicas

As variáveis ??globais que não têm um inicializador explícito são alocados na seção BSS no executável. Eles realmente não ocupam qualquer espaço no EXE; seção BSS é uma seção especial que aloca OS e limpa para zero. Em outros sistemas operacionais, existem mecanismos semelhantes.

Você pode depender de variáveis ??globais sendo inicializado para zero.

campos de classe são padrão zero. Isso está documentado para que você pode contar com ele. varaiables pilha locais são indefinido a menos corda ou interface, estes são fixados em zero.

Assim como uma nota lateral (como você é novo para Delphi): As variáveis ??globais podem ser inicializados diretamente quando declará-los:

var myGlobal:integer=99;

Aqui está uma citação de Ray Lischners Delphi em poucas palavras Capítulo 2

"Quando Delphi primeiro cria um objeto, todos os campos começar vazio, isto é, os ponteiros são inicializados a zero, strings e matrizes dinâmicas estão vazios, os números têm o valor zero, campos booleanos são falsas, e as variantes são set para não atribuídos. (Veja NewInstance e InitInstance no Capítulo 5 para mais detalhes). "

É verdade que as variáveis ??locais-no escopo precisa ser inicializado ... eu tratar o comentário acima que "As variáveis ??globais são inicializados" como duvidosa até fornecidos com uma referência - Eu não acredito que

edit ... Barry Kelly diz que você pode depender deles sendo zero-inicializado, e desde que ele está no time do compilador Delphi Eu acredito que se :) Obrigado Barry.

As variáveis ??globais e dados de objeto de instância (campos) são sempre inicializado para zero. As variáveis ??locais em procedimentos e métodos não são inicializados em Win32 Delphi; seu conteúdo é indefinido até que você atribuir-lhes um valor no código.

Mesmo se uma linguagem faz inicializações padrão oferecer, eu não acredito que você deve confiar neles. Inicializar para um valor torna muito mais claro para outros desenvolvedores que pode não saber sobre inicializações padrão nos problemas de linguagem e impede toda compiladores.

De Delphi 2007 arquivo de ajuda:

ms-help: //borland.bds5/devcommon/variables_xml.html

"Se você não inicializar explicitamente uma variável global, o compilador inicializa a 0."

Eu tenho um pouco de gripe com as respostas dadas. zeros Delphi fora do espaço de memória dos globals e os objetos recém-criados. Enquanto isto NORMALMENTE significa que eles são inicializados há um caso onde eles não são: tipos com valores específicos enumerados. E se zero não é um valor legal ??

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top