Массив указателей члена, он инициализирован? - PullRequest
0 голосов
/ 05 января 2010

Если у меня есть

class A
{
private:
  Widget* widgets[5];
};

Гарантируется ли, что все указатели имеют значение NULL или мне нужно инициализировать их в конструкторе? Это правда для всех компиляторов?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 05 января 2010

Массив не инициализируется, если вы не сделаете это. Стандарт не требует инициализации массива.

2 голосов
/ 05 января 2010

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

Если это глобальная переменная, то равно заполнено нулями.

Это верно для всех совместимых компиляторов.

0 голосов
/ 11 января 2010

В общем случае массив не будет инициализирован. Однако имейте в виду, что начальное значение объекта типа класса зависит не только от того, как определен сам класс (конструктор и т. Д.), Но также может зависеть от initializer , используемого при создании объекта.

Таким образом, в некоторых случаях ответ на ваш вопрос может зависеть от инициализатора , который вы предоставляете при создании объекта, и от версии языка C ++, которую реализует ваш компилятор.

Если вы не укажете инициализатор, массив будет содержать мусор.

A* pa = new A;
// Garbage in the array

A a;
// Garbage in the array

Если указать инициализатор (), в C ++ 98 массив все равно будет содержать мусор. Однако в C ++ 03 объект будет инициализирован значением, а массив будет содержать нулевые указатели

A* pa = new A();
// Null-pointers in the array in C++03, still garbage in C++98

A a = A();
// Null-pointers in the array in C++03, still garbage in C++98

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

0 голосов
/ 05 января 2010

Это зависит от платформы и от того, как вы выделяете или объявляете экземпляры A. Если он находится в стеке или куче, вам нужно явно инициализировать его. Если это с размещением new и пользовательским распределителем, который инициализирует память на ноль, или вы объявляете экземпляр в области видимости файла И платформа имеет константу нулевого указателя, которая будет поразрядно равна нулю, вы не будете. В противном случае вам следует.

РЕДАКТИРОВАТЬ: я полагаю, я должен был указать очевидное, что "не предполагать, что это происходит".

Хотя на самом деле ответ «это зависит от платформы». Стандарт только говорит вам, что происходит, когда вы инициализируете явно или в области видимости файла. В противном случае проще всего предположить, что вы находитесь в среде, которая будет делать то, что вам нужно.

А если вам действительно нужно знать (для образовательных или оптимизационных целей), обратитесь к документации и выясните, на что вы можете положиться для этой платформы.

...