На самом деле функция не возвращает массив int
s (т. Е. int[N]
). То, что он возвращает, является указателем на int
(int *
). Оказывается, этот указатель указывает на первый элемент массива из s
элементов типа int
.
Обратите внимание, что память выделяется new
:
int *ret = new int[s];
Таким образом, массив int
с указываемого ret
имеет динамический срок хранения. В частности, это означает, что
1) компилятор не будет автоматически вызывать деструктор каждого элемента массива. (В этом случае это не проблема, потому что элементы имеют тип int
, но могут быть, если вместо элементов, где тип класса с нетривиальным деструктором.)
2) компилятор не будет автоматически освободить выделенную память.
Для контраста рассмотрим следующий код:
void g() {
int p[10]; // allocates 10 integer in the stack
// use p ...
}
Когда g
заканчивается компилятор будет выполнять вышеупомянутые операции. Для этого размер массива (10 в этом примере) должен быть установлен во время компиляции. Если вы не знаете размер во время компиляции, то вам нужно new
, как в исходном коде.
Для динамически распределенных массивов ответственность программиста заключается в обеспечении выполнения двух вышеупомянутых операций, когда массив больше не нужен. Для достижения этой цели, вы должны вызвать delete[]
:
delete[] p; // where p is a `int*` with the same value as `ret`
На практике это гораздо сложнее, чем кажется, из-за возможности исключения бросают. Например, рассмотрит этот код
void foo() {
int* p = f(10); // where f is in the question
// ... use the array pointed by p
a_function_that_might_throw();
delete[] p;
}
Если a_function_that_might_throw
делает сгенерирует исключение, то выполнение никогда не reachs точки, где p
удаляются. В этом случае память , выделенная new
(внутри f
), не будет освобождена (она протекает) до завершения программы .
Чтобы избежать этой проблемы, вместо исходного указателя (например int*
), лучше использование смарт-указатель (например, std::unique_ptr
или std::shared_ptr
).
И, наконец, память, выделенная new
, является памятью кучи. Однако, вы можете изменить это поведение.
Он не возвращает массив. Он возвращает указатель на первый элемент динамически распределенного массива. – Nawaz