Как я могу сделать `new []` default-initialize для массива примитивных типов? - PullRequest
23 голосов
/ 18 марта 2010

Время от времени мне нужно вызывать new[] для встроенных типов (обычно char). В результате получается массив с неинициализированными значениями, и я должен использовать memset() или std::fill() для инициализации элементов.

Как мне сделать new[] инициализацию по умолчанию для элементов?

Ответы [ 3 ]

32 голосов
/ 18 марта 2010

int* p = new int[10]() должен сделать.

Однако, как Майкл указывает на , лучше использовать std::vector.

23 голосов
/ 18 марта 2010

Почему бы вам просто не использовать std :: vector? Он сделает это за вас автоматически.

std::vector<int> x(100); // 100 ints with value 0
std::vector<int> y(100,5); // 100 ints with value 5

Также важно отметить, что использование векторов лучше, поскольку данные будут надежно уничтожены. Если у вас есть оператор new[], а затем выдается исключение, выделенные данные будут пропущены. Если вы используете std :: vector, то будет вызван деструктор вектора, что приведет к правильному освобождению данных.

2 голосов
/ 01 марта 2017

Эта относительно старая тема теперь может быть дополнена другим вариантом. Я использовал bool, потому что есть довольно странная специализация для vector<bool>

#include <memory>
...
unique_ptr<bool[]> p{ new bool[count] {false} };

теперь можно получить доступ с помощью operator[]

p[0] = true;

точно так же, как std::vector<T>, это исключительная ситуация.

(я полагаю, это было невозможно в 2010 году :))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...