POD класс инициализирован с размещением нового значения по умолчанию инициализировано? - PullRequest
3 голосов
/ 14 июля 2009

Если я инициализирую POD-класс с новым размещением, могу ли я предположить, что память будет инициализирована по умолчанию (в нули)? Этот ресурс четко заявляет, что если вы явно вызовете конструктор по умолчанию с нулевым аргументом, поля будут инициализированы по умолчанию, но неясно, будет ли это выполнено с использованием реализации размещения по умолчанию new (передача адреса) , Это стандартное поведение для памяти обнуляется в этом случае?

1 Ответ

4 голосов
/ 14 июля 2009

С начала:

5.3.4 / 15:

  • Если новый инициализатор имеет форму (), то элемент инициализируется значением (8.5);

8.5 / 5:

К значение-инициализация объект типа T означает:

  • если T является типом класса (раздел 9) с конструктором, объявленным пользователем (12.1), то вызывается конструктор по умолчанию для T (и инициализация некорректна, если у T нет доступного конструктора по умолчанию) ;

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

  • если T является типом массива, то каждый элемент инициализируется значением;

  • в противном случае объект инициализируется нулями

Первый маркер здесь не применяется, потому что у вас есть тип POD и, следовательно, вы не можете иметь конструктор, объявленный пользователем. Членами вашего типа могут быть только типы POD, такие как int, float и т. Д., Или вложенная структура, которая также является POD или массивом типов POD. Таким образом, в конечном итоге каждый из них заканчивается на последнем маркере: «в противном случае объект инициализируется нулями».

Эта инициализация происходит потому, что класс POD инициализируется в предоставленной вами памяти. Неважно, что память была выделена ОС или вы указали адрес.

Итак, ИМХО, ответ - да - члены будут инициализированы нулями.

...