Jsou Delphi proměnné inicializuje s hodnotou ve výchozím nastavení?

hlasů
85

Jsem nový Delphi, a byl jsem běží nějaké testy, aby viděli, co objekt proměnné a zásobníkové proměnné jsou nastaveny na výchozí:

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

Toto chování jsem zvyklý z jiných jazyků, ale já jsem přemýšlel, jestli je to bezpečné spoléhat na to v Delphi? Například, já jsem přemýšlel, jestli to může záviset na nastavení kompilátoru, nebo snad pracovat odlišně na různých strojích. Je to normální spoléhat na výchozí inicializaci hodnoty pro předměty, nebo si explicitně nastavit všechny proměnné instance v konstruktoru?

Pokud jde o hranici (postup úrovně) proměnných, moje testy ukazují, že unitialized Booleans jsou pravdivé, unitialized čísla jsou 2129993264 a uninialized objekty jsou jen neplatné ukazatele (tedy ne nil). Hádám, že normu je vždy nastavit proměnné postup na úrovni před přístupu k nim?

Položena 25/09/2008 v 12:28
zdroj uživatelem
V jiných jazycích...                            


9 odpovědí

hlasů
17

Pole tříd jsou výchozí nulová. To je dokumentováno, takže se můžete spolehnout na to. Místní zásobníku varaiables jsou definována, pokud řetězec nebo rozhraní, tyto jsou nastaveny na nulu.

Odpovězeno 25/09/2008 v 12:33
zdroj uživatelem

hlasů
90

Ano, to je zdokumentováno chování:

  • Pole objektů jsou vždy inicializována na hodnotu 0, 0.0 ‚‘, False, nil nebo co platí.

  • Globální proměnné jsou vždy nastaveny na 0 stejně dobře;

  • Místní referenční započtena * proměnné jsou vždy inicializován na nulu nebo ‚‘;

  • Lokální proměnné non referenční započtena * jsou neinicializovanou takže budete muset přiřadit hodnotu, než budete moci použít.

Vzpomínám si, že Barry Kelly někde napsal definici „referenční-počítal“, ale nelze najít nic víc, takže by to mělo dělat do té doby:

Referenční započtena ==, které jsou referenční-počítá se, nebo přímo nebo nepřímo obsahují oblastech (záznamů) nebo prvky (pro pole), které jsou referenční-počítá jako: string, variant, interface nebo dynamické pole nebo statické pole obsahující tyto typy.

Poznámky:

  • record sama o sobě nestačí, aby se stala referenčního počítá
  • Nezkoušel jsem to s generik dosud
Odpovězeno 25/09/2008 v 12:41
zdroj uživatelem

hlasů
4

Globální proměnné a objekt instance dat (pole) jsou vždy nastaveny na nulu. Lokální proměnné v postupech a metodách, nejsou inicializovány v Win32 Delphi; Jejich obsah je nedefinovaná, dokud jim přiřadit hodnotu v kódu.

Odpovězeno 25/09/2008 v 12:42
zdroj uživatelem

hlasů
2

Dokonce i v případě, že jazyk se nabízejí výchozí inicializace, nevěřím, že byste se na ně spolehnout. Inicializace na hodnotu je mnohem jasnější ostatním vývojářům, kteří nemusí vědět o výchozí inicializace v jazyce a brání problémy napříč překladačů.

Odpovězeno 25/09/2008 v 12:57
zdroj uživatelem

hlasů
8

Zde je citát z Ray Lischners Delphi v kostce kapitole 2

„Když Delphi nejprve vytvoří objekt, všechna pole začít prázdný, to znamená, že ukazatele jsou inicializovány na nulu, smyčce a dynamická pole jsou prázdné, čísla mají nulovou hodnotu, logické pole jsou False a varianty jsou nastaveny na Unassigned. (Viz NewInstance a InitInstance v kapitole 5 pro podrobnosti.)“

Je pravda, že místní in-rozsah proměnných je třeba inicializovat ... bych léčit komentář nad tím, že „globální proměnné jsou inicializovány“ jako pochybný, dokud opatřen odkazem - Nevěřím, že.

editovat ... Barry Kelly říká, že se můžete spolehnout na nich je nulová inicializovat, a od té doby je na kompilátoru týmu Delphi Domnívám se, že stojí :) Díky Barryho.

Odpovězeno 25/09/2008 v 13:03
zdroj uživatelem

hlasů
4

Od Delphi 2007 help souboru:

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

„Pokud není explicitně inicializovat globální proměnnou, překladač inicializuje ji na hodnotu 0.“

Odpovězeno 25/09/2008 v 15:27
zdroj uživatelem

hlasů
3

Mám jednu malou remcání s odpovědí. Delphi nuly na paměťový prostor o globals a nově vytvořených objektů. Zatímco toto NORMÁLNĚ znamená, že jsou inicializovány je jeden případ, kdy nejsou: výčtový typ se specifickými hodnotami. Co když nula není právní hodnotu ??

Odpovězeno 25/09/2008 v 15:46
zdroj uživatelem

hlasů
24

Globální proměnné, které nemají explicitní inicializátor jsou přiděleny v oddíle BSS v spustitelného souboru. Nemají vlastně zabírají jakékoliv místo v EXE; úsek BSS je speciální část, která operační systém přiděluje a vymaže na nulu. Na jiných operačních systémech, tam jsou podobné mechanismy.

Můžete se spolehnout na globální proměnné jsou nulové inicializaci.

Odpovězeno 25/09/2008 v 16:58
zdroj uživatelem

hlasů
15

Stejně jako vedlejší poznámku (jak jste na Delphi): Globální proměnné lze inicializovat přímo při ohlášení je:

var myGlobal:integer=99;
Odpovězeno 30/01/2009 v 14:30
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more