Нулевой распределитель по умолчанию обнуляет int? - PullRequest
5 голосов
/ 06 марта 2012

При использовании контейнеров STL я не уверен, был ли обнулен int, выделенный распределителем по умолчанию. Следующий код указывает «да» на вопрос:

#include <map>
#include <iostream>

int main() {
  using namespace std;
  map<int, int> m;
  cout << m[1234] << endl;
}

Поскольку ни один документ не подтвердил это, я не смею воспринимать это как должное.

Ответы [ 4 ]

6 голосов
/ 06 марта 2012

Стандарт гарантирует, что объекты, созданные в результате использования оператора индекса, создаются по умолчанию. Обнуляет ли конструктор по умолчанию для какого-либо конкретного класса членов, которые вы ожидаете обнулить, зависит от класса. Для классов без конструкторов члены конструируются по умолчанию, и базовые типы конструирования по умолчанию равны нулю для их версии.

Обратите внимание, это не имеет никакого отношения к распределителям! ... и вполне безопасно предположить, что распределители tbe оставляют память нетронутой, за исключением, возможно, выделенных распределителей отладки (или распределителей, написанных людьми, которые считают, что обнуление памяти может быть хорошей вещью, а не устройством, скрывающим ошибки). ... и распределитель отладки не обнуляет память, а заполняет ее распознаваемым шаблоном (например, при просмотре в шестнадцатеричном виде 0xdeadbeef).

6 голосов
/ 06 марта 2012

В реализации std::map::operator[] вы увидите, что если элемент не найден в индексе, вставляется новый элемент и возвращается:

ReturnValue = this->insert(where, make_pair(key_value, mapped_type()));

, где mapped_type - второйтипа, в вашем случае int.Так что да, он по умолчанию инициализируется как 0, так как он вставляется как mapped_type().

2 голосов
/ 06 марта 2012

Может быть, это: 8.5.5 Инициализаторы Стандарт C ++ - ANSI ISO IEC 14882 2003

Инициализация объекта типа T с нуля означает: если T - скалярный тип (3.9), объекту присваивается значение 0 (ноль), преобразованное в T;

1 голос
/ 22 ноября 2014

Кажется, что шаблон распределителя по умолчанию будет использовать new int() для инициализации по умолчанию int в 0, в соответствии со стандартом C ++ ISO 14882: 2003.Глава 8.5, пункт 5,7:

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

  • , если T скалярный тип(3.9) для объекта установлено значение 0 (ноль), преобразованное в T;

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

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

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

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

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

To default-initialize объект типа T означает:

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

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

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

Объект, инициализатором которого является пустой набор скобок, т. Е. (), Должен бытьинициализированное значение.

В проекте стандарта C ++ 11 ISO есть аналогичные правила.

...