Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Почему бы вам просто не использовать 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, тогда будет выведен вектор-деструктор, который приведет к правильной деадаптации данных.

Ответ 3

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

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

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

p[0] = true;

как и std::vector<T>, это безопасное исключение.

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