Поскольку ответ Каски касается только c ++, мой ответ для delphi:
В delphi см. этот ответ от Джакомо Дель Эспости
- Поля объекта всегда инициализируются равными 0, 0.0, '', False, nil или любым другим.
- Глобальные переменные всегда инициализируются. (до 0)
- Локальные переменные унифицированы, поэтому вам необходимо присвоить значение, прежде чем вы сможете их использовать.
мс-помощь: //borland.bds4/bds4ref/html/Variables.htm
Все кредиты Джакомо Дельи Эспости
Редактировать : " Гарантирует ли Windows, что память инициализируется нулями, когда она впервые передается в стек или кучу программы? "
Windows гарантирует, что память инициализируется нулями, когда она впервые передается новому процессу (в противном случае у вас возникнет серьезная проблема безопасности с программами, способными считывать другие процессы, отбрасывавшие память независимо от разрешений). Однако, используя c ++, эта гарантия вам мало поможет, так как c-runtime может перезаписать память по своему усмотрению, прежде чем ваш код получит какую-либо возможность ее использовать.
Edit2 : переменные построителя c ++ явно инициализируются для " классов в стиле VCL " (что бы это ни значило, все, что наследуется от TObject?), См. http://docs.embarcadero.com/products/rad_studio/cbuilder6/EN/CB6_DevelopersGuide_EN.pdf
Цитирую:
"Поскольку члены данных могут использоваться в виртуальных функциях, важно
понять, когда и как они инициализируются. В Object Pascal все неинициализированные данные
инициализируется нулями. Это относится, например, к базовым классам, чьи конструкторы
не вызывается с наследственным. В стандарте C ++ нет гарантии значения
неинициализированные члены данных. Следующие типы членов класса должны быть
инициализируется в списке инициализации конструктора класса:
• Рекомендации
• Элементы данных без конструктора по умолчанию
Тем не менее, значение этих элементов данных или инициализированных в теле
конструктор, не определен при вызове конструкторов базового класса. В C ++ Builder,
память для классов в стиле VCL инициализируется нулями.
Технически, это память класса VCL или CLX, равная нулю, то есть биты
ноль, значения на самом деле не определены. Например, ссылка равна нулю.
Виртуальная функция, основанная на значении переменных-членов, инициализированных в
Тело конструктора или в списке инициализации может вести себя так, как будто переменные
инициализируется до нуля. Это потому, что конструктор базового класса вызывается перед
обработан список инициализации или введено тело конструктора.
#include <sysutils.hpp>
class Base : public TObject {
public:
__fastcall Base() { init(); }
virtual void __fastcall init() { }
};
class Derived : public Base {
public:
Derived(int nz) : not_zero(nz) { }
virtual void __fastcall init()
{
if (not_zero == 0)
throw Exception("not_zero is zero!");
}
private:
int not_zero;
};
int main(void)
{
Derived *d42 = new Derived(42);
return 0;
}
Этот пример вызывает исключение в конструкторе Base. Потому что база
созданный до Derived, not_zero, еще не был инициализирован со значением 42
перешел к конструктору. Имейте в виду, что вы не можете инициализировать данные членов вашего
Класс в стиле VCL перед вызовом его конструкторов базового класса. "