Это полный оператор 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 Управление памятью.