superfaq - subspan c++




Как я могу сделать `new[]` default-initialize массив примитивных типов? (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[] оператор new[] , а затем исключается исключение, выделенные данные будут просачиваться. Если вы используете std :: vector, тогда будет вызван деструктор вектора, в результате чего данные будут правильно освобождены.

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

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


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

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

к этому теперь можно обратиться с помощью operator[]

p[0] = true;

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

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





initialization