2013-06-30 5 views
0

В моем классе я хотел бы иметь некоторый динамически распределенный логический массив. Я использую shared_ptr держать его:C++ Инициализационный массив, обработанный boost :: shared_ptr

boost::shared_ptr<bool[]> someBoolArray; 

Распределение памяти происходит в конструкторе класса:

// someValue was read from file 
someBoolArray = boost::shared_ptr<bool[]>(new bool[someValue]); 

Можно ли установить начальное значение для моего массива во время инициализации shared_ptr?
Я хочу, чтобы все значения в массиве были ложными по умолчанию.

+0

Нулевая инициализация в порядке или она должна быть конкретным, определяемым пользователем набором значений? – jogojapan

+0

Я хочу, чтобы все значения в массиве были ложными по умолчанию. – vard

+0

Для этого вам следует использовать 'boost :: shared_array'. – jrok

ответ

3

Если вы хотите, чтобы гарантировать, что элементы установлены в false, вам необходимо выражение типа

new T[N](); 

В этом случае,

someBoolArray = boost::shared_ptr<bool[]>(new bool[someValue]()); 
//               ^^ 
1

в C++ 11 вы можете передать инициализатору к массиву:

new bool[someValue] {false} 

И я предлагаю вам использовать make_shared вместо вашей формы.

1

Если вы не есть C++ 11, вам нужно заменить bool массив с классом, который очищает массив в своем конструкторе, так как вы можете использовать только конструктор по умолчанию при выделении массивов объектов , Этот класс должен содержать bool* и иметь операторов-операторов bool* и const bool*, а также operator [].

Или вы можете отказаться от очистки массива при строительстве и добавить цикл for сразу после вашей линии someBoolArray = ..., чтобы сделать очистку. Любой подход приводит к тому же скомпилированному коду.

BTW, невозможность создания массивов объектов с конструкторами, отличными от конструктора по умолчанию, была дефектом языка, адресуемым C++ 11.

+0

Но вы можете хотя бы называть 'new bool [N]()', который устанавливает все элементы в 'false'. – juanchopanza

+0

@juanchopanza Да, это то, что я имел в виду, когда я спросил о нулевой инициализации в комментарии. Как ни странно, я не могу получить стимул принять это. Возможно, моя версия недостаточно актуальна. – jogojapan

0

shared_ptr не работает таким образом, см., Например, shared_ptr to an array : should it be used? и Does C++11 have wrappers for dynamically-allocated arrays like Boost's scoped_array?.

В ответ на ваш вопрос построенный по умолчанию bool (как вы получите с new bool[4711]()) должен иметь значение false, так что вы должны быть в порядке.

+1

Вопрос о 'boost :: shared_ptr', который ведет себя, по-видимому, имеет специализацию для массивов. Кроме того, 'new bool [N]' не будет устанавливать элементы в 'false'. – juanchopanza

+0

Конструктор по умолчанию для 'bool' похож на другие целые типы: он ничего не делает.Вас может смутить тот факт, что функция-статический или глобальный массив bool * инициализируется до 0, но это последнее дело (я думаю, что оно переносится с C, на самом деле) и не требуется стандартом. –

Смежные вопросы