Le variabili delphi sono inizializzate con un valore di default?

Sono nuovo di Delphi e ho eseguito alcuni test per vedere quali variabili object e variabili dello stack sono inizializzate per impostazione predefinita:

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

Questo è il comportamento a cui sono abituato da altre lingue, ma mi chiedo se è sicuro affidarsi a Delphi? Ad esempio, mi chiedo se potrebbe dipendere da un’impostazione del compilatore, o forse funzionare in modo diverso su macchine diverse. È normale fare affidamento sui valori inizializzati predefiniti per gli oggetti oppure si impostano esplicitamente tutte le variabili di istanza nel costruttore?

Per quanto riguarda le variabili stack (livello di procedura), i miei test stanno mostrando che i booleani unitializzati sono veri, gli interi unitializzati sono 2129993264 e gli oggetti non inizializzati sono solo puntatori non validi (cioè non nulli). Immagino che la norma sia di impostare sempre variabili a livello di procedura prima di accedervi?

Sì, questo è il comportamento documentato:

  • I campi object sono sempre inizializzati su 0, 0.0, ”, False, zero o qualsiasi altra cosa.

  • Le variabili globali sono sempre inizializzate anche a 0 ecc;

  • Le variabili locali conteggiate con riferimento * sono sempre inizializzate su zero o “”;

  • Le variabili locali conteggiate non di riferimento * non sono inizializzate, pertanto è necessario assegnare un valore prima di poterle utilizzare.

Ricordo che Barry Kelly da qualche parte ha scritto una definizione per “reference-counted”, ma non la trova più, quindi nel frattempo dovrebbe farlo:

conteggiati di riferimento == che sono conteggiati di riferimento stessi o che contengono direttamente o indirettamente campi (per record) o elementi (per matrici) conteggiati con riferimento come: string, variant, interface o array dinamico o array statico contenente tali tipi.

Gli appunti:

  • record se stesso non è sufficiente per diventare un conteggio di riferimento
  • Non l’ho ancora provato con i farmaci generici

Le variabili globali che non hanno un inizializzatore esplicito sono allocate nella sezione BSS nell’eseguibile. In realtà non occupano nessuno spazio nel file EXE; la sezione BSS è una sezione speciale che il sistema operativo alloca e azzera a zero. Su altri sistemi operativi, esistono meccanismi simili.

È ansible dipendere dalle variabili globali che vengono inizializzate a zero.

I campi di class sono zero di default. Questo è documentato in modo da poter fare affidamento su di esso. I varaiables stack locali non sono definiti a meno che stringa o interfaccia non siano impostati su zero.

Proprio come una nota a margine (dato che sei nuovo a Delphi): le variabili globali possono essere inizializzate direttamente quando le dichiari:

 var myGlobal:integer=99; 

Ecco una citazione da Ray Lischners Delphi in a Nutshell Capitolo 2

“Quando Delphi crea prima un object, tutti i campi iniziano vuoti, cioè i puntatori vengono inizializzati su zero, le stringhe e gli array dinamici sono vuoti, i numeri hanno il valore zero, i campi booleani sono falsi e le varianti sono impostati su Non assegnati. (Vedi NewInstance e InitInstance nel Capitolo 5 per i dettagli.) ”

È vero che le variabili local-in-scope devono essere inizializzate … Tratterei il commento sopra che “Le variabili globali sono inizializzate” come discutibili fino a quando non viene fornito un riferimento – non ci credo.

modifica … Barry Kelly dice che si può dipendere dal fatto che siano inizializzati a zero, e dal momento che si trova nel team di compilatori Delphi, credo che supporti 🙂 Grazie Barry.

Le variabili globali e i dati di istanza dell’object (campi) vengono sempre inizializzati a zero. Le variabili locali in procedure e metodi non sono inizializzate in Win32 Delphi; il loro contenuto non è definito fino a quando non si assegna loro un valore nel codice.

Dal file di aiuto di Delphi 2007:

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

“Se non si inizializza esplicitamente una variabile globale, il compilatore la inizializza a 0.”

Ho una piccola lamencanvas con le risposte date. Delphi azzera lo spazio di memoria dei globali e degli oggetti appena creati. Mentre questo NORMALMENTE significa che sono inizializzati, c’è un caso in cui non lo sono: tipi enumerati con valori specifici. Cosa succede se zero non è un valore legale ??

Anche se una lingua offre inizializzazioni predefinite, non credo che dovresti fare affidamento su di esse. L’inizializzazione di un valore rende molto più chiaro agli altri sviluppatori che potrebbero non conoscere le inizializzazioni predefinite nella lingua e impedisce problemi tra i compilatori.