Переменные delphi инициализируются значением по умолчанию?
Я новичок в Delphi, и я запускал некоторые тесты, чтобы узнать, какие переменные объектов и переменные стека инициализируются по умолчанию:
TInstanceVariables = class
fBoolean: boolean; // always starts off as false
fInteger: integer; // always starts off as zero
fObject: TObject; // always starts off as nil
end;
Это поведение, с которым я привык с других языков, но мне интересно, можно ли полагаться на него в Delphi? Например, мне интересно, может ли это зависеть от настройки компилятора или, возможно, работать по-разному на разных машинах. Нормально ли полагаться на инициализированные значения по умолчанию для объектов или вы явно задаете все переменные экземпляра в конструкторе?
Что касается переменных стека (уровня на уровне процедуры), мои тесты показывают, что unitialized booleans истинны, а целые числа счисления - 2129993264, а неинициализированные объекты - это просто недопустимые указатели (т.е. не ноль). Я предполагаю, что норма должна всегда устанавливать переменные уровня процедуры перед их доступом?
Ответы
Ответ 1
Да, это документированное поведение:
-
Поля объекта всегда инициализируются 0, 0.0, '', False, ноль или что-то еще.
-
Глобальные переменные всегда инициализируются также 0 и т.д.
-
Локальные подсчетные переменные всегда инициализируются нулем или ';;
-
Локальные переменные, не содержащие ссылки, не инициализированы, поэтому вы должны назначить значение, прежде чем сможете их использовать.
Я помню, что Барри Келли где-то написал определение для "reference-counted", но больше не может его найти, поэтому это должно сделать в то же время:
reference-counted ==, которые подсчитываются сами по себе, или прямо или косвенно содержат поля (для записей) или элементы (для массивы), которые подсчитываются как: string, variant, interface
или динамический массив или статический массив, содержащий такие типы.
Примечания:
-
record
сам по себе недостаточно, чтобы засчитываться
- Я еще не пробовал это с дженериками.
Ответ 2
Глобальные переменные, не имеющие явного инициализатора, выделяются в разделе BSS в исполняемом файле. Они фактически не занимают места в EXE; раздел BSS - это специальный раздел, который ОС выделяет и очищает до нуля. В других операционных системах существуют аналогичные механизмы.
Вы можете зависеть от глобальных переменных, инициализированных нулями.
Ответ 3
Поля класса по умолчанию равны нулю. Это документировано, поэтому вы можете положиться на него.
Локальные varayables стека undefined, если строка или интерфейс не установлены равными нулю.
Ответ 4
Как примечание к стороне (поскольку вы новичок в Delphi): глобальные переменные могут быть инициализированы непосредственно при их объявлении:
var myGlobal:integer=99;
Ответ 5
Здесь цитата из Ray Lischners Delphi в двух словах Глава 2
"Когда Delphi сначала создает объект, все поля начинаются пустым, то есть указатели инициализируются на нуль, строки и динамические массивы пусты, числа имеют нулевое значение, логические поля - False, а варианты заданы к Неназначенному (подробности см. в NewInstance и InitInstance в Главе 5.)"
Верно, что переменные local-in-scope должны быть инициализированы... Я бы рассмотрел вышеприведенный комментарий, что "Глобальные переменные инициализируются" как сомнительные до тех пор, пока не будет предоставлена ссылка - я не верю в это.
редактировать...
Барри Келли говорит, что вы можете полагаться на то, что они ноль-инициализированы, и поскольку он в команде разработчиков Delphi, я считаю, что стоит:) Спасибо Барри.
Ответ 6
Глобальные переменные и данные экземпляра объекта (поля) всегда инициализируются до нуля.
Локальные переменные в процедурах и методах не инициализируются в Win32 Delphi; их содержание undefined, пока вы не присвоите им значение в коде.
Ответ 7
Из файла справки Delphi 2007:
мс-помощь://borland.bds5/devcommon/variables_xml.html
"Если вы явно не инициализируете глобальную переменную, компилятор инициализирует ее до 0.
Ответ 8
У меня есть одна маленькая проблема с ответами. Delphi заносит в память пространство памяти глобалов и вновь созданных объектов. Хотя это NORMALLY означает, что они инициализированы, есть один случай, когда они не являются: перечислены типы со специфическими значениями. Что, если ноль не является юридическим значением?
Ответ 9
Даже если язык предлагает инициализацию по умолчанию, я не верю, что вы должны полагаться на них. Инициализация значения делает его более понятным для других разработчиков, которые могут не знать о инициализации по умолчанию в языке и предотвращают проблемы между компиляторами.