Переменные Дельфи инициализируются со значением по умолчанию?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

99
задан dan-gph 24 October 2012 в 01:19
поделиться

9 ответов

Да, это - зарегистрированное поведение:

  • Поля объекта всегда инициализируются к 0, 0.0, ", Ложь, ноль или независимо от того, что применяется.

  • Глобальные переменные всегда инициализируются к 0 и т.д. также;

  • считаемый на локальную ссылку* переменные всегда инициализируются к нолю или'';

  • Локальный не считаемый на ссылку* переменные являются неинициализированными, таким образом, необходимо присвоить значение, прежде чем можно будет использовать их.

я помню, что Barry Kelly где-нибудь записал определение для "считаемого на ссылку", но не может больше находить его, таким образом, это должно сделать тем временем:

считаемый на ссылку ==, которые считаются на ссылку самостоятельно, или прямо или косвенно содержат поля (для записей) или элементы (для массивов), которые считаются на ссылку как: string, variant, interface или динамический массив или статический массив содержащий такие типы.

Примечания:

  • record самостоятельно недостаточно для становления считаемым на ссылку
  • , я еще не попробовал это дженериками
101
ответ дан Community 24 November 2019 в 05:03
поделиться

Глобальные переменные, которые не имеют явного инициализатора, выделяются в разделе BSS в исполняемом файле. Они на самом деле не занимают места в EXE; раздел BSS является специальным разделом, который ОС выделяет и очищает для обнуления. В других операционных системах существуют подобные механизмы.

можно зависеть от инициализируемых нулем глобальных переменных.

26
ответ дан Barry Kelly 24 November 2019 в 05:03
поделиться

Поля класса являются нулем по умолчанию. Это документируется так, можно полагаться на него. Локальный стек varaiables не определен, если строка или интерфейс, они не обнуляются.

20
ответ дан Martin Liesén 24 November 2019 в 05:03
поделиться

Так же, как примечание стороны (поскольку Вы плохо знакомы с Delphi): Глобальные переменные могут быть инициализированы непосредственно при объявлении их:

var myGlobal:integer=99;
16
ответ дан bluish 24 November 2019 в 05:03
поделиться

Вот кавычка от Ray Lischners Delphi вкратце Глава 2

, "Когда Дельфи сначала создает объект, все поля начинаются пустой, то есть, указатели инициализируются к нолю, строки и динамические массивы пусты, числа имеют нуль значения, булевы поля являются Ложью, и Варианты установлены на Неприсвоенный. (См. NewInstance и InitInstance в Главе 5 для деталей.)"

Это верно, что должны быть инициализированы локальные в объеме переменные... Я рассматривал бы комментарий выше того "Глобальные переменные, инициализируются" как сомнительные, пока не предоставлено ссылку - я не верю этому.

редактирование... Barry Kelly говорит, что можно зависеть от них инициализируемый нулем, и так как он находится в команде компилятора Дельфи, я полагаю, что стоит:) Благодарит Barry.

8
ответ дан Drew Gibson 24 November 2019 в 05:03
поделиться

Глобальные переменные и данные экземпляра объекта (поля) всегда инициализируются для обнуления. Локальные переменные в процедурах и методах не инициализируются в Win32 Дельфи; их содержание не определено, пока Вы не присваиваете им значение в коде.

6
ответ дан Ondrej Kelle 24 November 2019 в 05:03
поделиться

Даже если язык действительно предлагает инициализации по умолчанию, я не полагаю, что необходимо полагаться на них. Инициализация к значению делает его намного более ясным другим разработчикам, которые не могли бы знать об инициализациях по умолчанию на языке и предотвращают проблемы через компиляторы.

4
ответ дан Thomas Owens 24 November 2019 в 05:03
поделиться

From Delphi 2007 справочного файла:

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

, "Если Вы явно не инициализируете глобальную переменную, компилятор инициализирует ее к 0".

4
ответ дан Ondrej Kelle 24 November 2019 в 05:03
поделиться

У меня есть тот мало схватывания с данными ответами. Нули Дельфи пространство памяти globals и недавно-созданных-объектов. В то время как это ОБЫЧНО средство, они инициализируются, существует один случай, где они не: перечислимые типы с определенными значениями. Что, если нуль не является легальным значением??

3
ответ дан Loren Pechtel 24 November 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: