Создание массива int * array = new int [sizeof (int) * n] - PullRequest
0 голосов
/ 07 апреля 2020

Можете ли вы объяснить, что происходит с этим утверждением, особенно в скобках?

int *array = new int[sizeof(int) * n];

1 Ответ

2 голосов
/ 07 апреля 2020

Это полный оператор C ++ и круглые скобки. () оператора sizeof содержит тип int, а sizeof(type) дает размер включающего типа в байтах:

int *array = new int[ sizeof(int) * n ];
                            ^^^^^

Я полагаю, вы имели в виду выражение в квадратных скобках [] из new выражение, т.е. sizeof(int) * n.

Семантически, выражение может быть неверно.

Если вы выделите 10 целых чисел с помощью оператора new, тогда sizeof(int) будет автоматически обработан. Вам просто нужно указать количество элементов типа, для которого вы выделяете.

Например:

int  n = 10;                // n can be an integer entered by the user
int* a = new int[n];        // allocate an array of 10 integers

Элементы массива будут default-initialized в этом случае возвращается указатель на первый элемент массива.

И, когда вы делаете это так (предположим, вы работаете на 64-битной машине, т.е. sizeof(int) равно 8):

int  n = 10;
int  s = sizeof(int) * n;   // 8 x 10 = 80
int* a = new int[ s ];      // allocate an array of 80 integers

Это то, что я ранее упоминал как семантически неверный , потому что, возможно, мы хотели выделить 10 целых, а не 80.

Выражение sizeof(int) * n требуется для malloc(), где вы должны указать точное количество байтов, которое вы хотите выделить, поэтому вам нужно указать точное количество элементов типа. Функция malloc() не инициализирует выделенные байты и также возвращает указатель на первый элемент.

Например:

int  n = 10;
int  s = sizeof(int) * n;
int* a = (int*) malloc( s );

Вы должны инициализировать память, выделенную malloc(). Для получения дополнительной информации об этом обратитесь к вышеуказанным ссылкам new и malloc().


Кроме того, вы выделяете память, поэтому вы обязаны освободить ее, когда закончите. Таким образом, в идеале new и new[] будут следовать delete и delete[] соответственно. И, malloc() будет сопровождаться free().

См. Интеллектуальные указатели, например, std :: unique_pointer и std :: shared_ptr вместе с std::make_unique и std::make_shared для RAII - На основе автоматов c Управление памятью.

...