Как инициализировать динамический c массив указателей на nullptr c ++ - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть код:

var *item[8] = { nullptr };

, и он работает хорошо. Но мне нужно сделать это динамически. Вот что я попробовал:

int n = 8;
var **item;
item = new var*[n]();
item = { nullptr };

, но это не работает. В чем разница и что мне делать?

// Извините за мой английский sh

Ответы [ 2 ]

3 голосов
/ 23 апреля 2020

() in item = new var*[n](); будет инициализировать значение для всех указателей на nullptr для вас, поэтому вам не нужно делать это вручную впоследствии.

int n = 8;
var **item;
item = new var*[n](); // <-- all are nullptr here

Live Demo

Тем не менее, вы действительно должны использовать std::vector вместо new[] напрямую:

int n = 8;
std::vector<var*> item;
item.resize(n);

Или просто:

int n = 8;
std::vector<var*> item(n);

Демонстрация в реальном времени

В любом случае указатели также должны инициализироваться до nullptr. Но если вы хотите быть откровенным об этом, вы можете сделать это:

int n = 8;
std::vector<var*> item;
item.resize(n, nullptr);
int n = 8;
std::vector<var*> item(n, nullptr);

Live Demo

1 голос
/ 23 апреля 2020

, если у вас есть массив, вектор или контейнер в целом, и вы хотите заполнить его некоторым значением, в зависимости от того, что вы можете использовать, функцию std :: fill:

std::fill(item,item+n,nullptr);

Однако, если вы хотите назначить nullptr во время инициализации гораздо проще: вы используете нулевую инициализацию и все в порядке. Просто помните о разнице между нулем и инициализацией по умолчанию:

item = new var*[n]{};     //zero initialized (all elements would have nullptr as value)

item = new var*[n];       //default initialized (elements might not have nullptr as value)

item = new var*[n]();     //default initialized until C++03
                          //zero initialized after C++03

В любом случае, я бы посоветовал вам перейти на std :: vector вместо массивов C. Обычно вы получаете гораздо меньше кода, подверженного ошибкам.

...