Память под статический массив по стандарту резервируется в программном стеке во время компиляции, который ограничен размером, как правило это два мегабайта, но может быть и больше. Память, которая резервируется под статические массивы в одной области видимости – суммируется, и это следует учитывать. Размер статического массива должен быть известен к началу компиляции. Во время выполнения программы изменить размер статического массива невозможно. Память, выделяемая под динамический массив выделяется непрерывным куском в куче и ограничена ресурсами оперативной памяти. Размер динамического массива можно изменять во время выполнения программы.
К ответу двумя этажами выше. Оператор new не является синтаксическим сахаром, так как в отличии от malloc (calloc, realloc) вызывает конструкторы объектов, ну а delete, в отличие от free – вызывает деструкторы. Операторы new, new[], delete и delete[] можно перегружать, создавая собственные аллокаторы. Это тема большая и сложная.
Здесь подробнее об этом.
Память выделенная c использованием malloc (calloc, realloc) должна освобождаться вызовом free, а выделенная с использованием new (new[]), освобождается вызовом delete (delete[]). Освобождать память выделенную динамически следует обязательно, а указателю, по которому она была выделена следует присвоить nullptr (NULL). Перед вызовом delete (delete[]) либо free следует проверять указатель на существование
if (ptr != nullptr) {
delete ptr;
ptr = nullptr;
}
if (matrix != nullptr) {
for (size_t i = 0; i < length; ++i) delete[] matrix[i];
delete[] matrix;
matrix = nullptr;
}
if (ptr != NULL) {
free(ptr);
ptr = NULL;
}
Память под статический массив освобождается автоматически после завершения блока кода в котором она была выделена.
Любые попытки непредусмотренного стандартом вызова malloc, calloc, realloc, new, new[], delete, delete[], free могут привести к неопределённому поведению
Николай ВеселухаВысший разум (384109)
1 год назад
В системе Windows размер статического глобального массива не может превышать 0x7FFFFFFF байт. Это много, и это ни есть хорошо. ОЗУ, несмотря на её огромные размеры всегда находится во фрагментированном состоянии и не факт что на момент запуска процесса в системе имеется непрерывный кусок памяти под ваш массив. Особенно этим грешат пользовательские ОС, на серверных дела обстоят лучше, там память непрерывно дефрагментируется в процессе работы. А как сейчас, наши умельцы на 32-разрядные платформы устанавливают 64-разрядные системы, то с ОЗУ у них острый дефицит возникает ещё в момент запуска, какие там 500 мегабайт под массив? Отказ в запуске и месть, месть, месть!
int a[5];
и int* a = new int[5];
и так и так в обоих массивах выделены места под значения и в дальнейшем можно будет инициализировать любыми значениями, так же delete можно применить как к int a[5]; так и к int* a = new int[5];
в чем таки разница?