new (C++)
В языке программирования C++, new — оператор, обеспечивающий выделение динамической памяти в куче. За исключением формы, называемой «размещающей формой new», new пытается выделить достаточно памяти в куче для размещения новых данных и, в случае успеха, возвращает адрес свежевыделенной памяти. Однако, если new не может выделить память в куче, то он передаст (throw) исключение типа std::bad_alloc
. Это устраняет необходимость явной проверки результата выделения.
Синтаксис
Синтаксис new выглядит следующим образом:
p_var = new typename;
где p_var
— ранее объявленный указатель типа typename
. typename
может подразумевать собой любой фундаментальный тип данных или объект, определенный пользователем (включая, enum
, class
и struct
). Если typename
— это тип класса, то вызывается конструктор по умолчанию для создания объекта.
Для инициализации новой переменной, созданной при помощи new
нужно использовать следующий синтаксис:
p_var = new type(initializer);
где initializer
— первоначальное значение, присвоенное новой переменной, а если type
— тип класса, то initializer
— аргумент(ы) конструктора.
new
может также создавать массив:
p_var = new type [size];
В данном случае, size
указывает размерность (длину) создаваемого одномерного массива. Адрес первого элемента возвращается и помещается в p_var
, поэтому
p_var[n]
означает значение n
-го элемента (считая от нулевой позиции)
Память, выделенная при помощи new
, должна быть освобождена при помощи delete
, дабы избежать утечки памяти. Массивы, выделенные (созданные) при помощи new[]
, должны освобождаться (уничтожаться) при помощи delete[]
.
int *p_scalar = new int(5);
int *p_array = new int[5];
Инициализаторы не могут быть указаны для массивов, созданных при помощи new
. Все элементы массива инициализируются при помощи конструктора по умолчанию для данного типа. Если тип не имеет конструктора по умолчанию, то произойдет ошибка при компиляции.
Реализация
В компиляторах, придерживающимся стандарта ISO C++, в случае если недостаточно памяти для выделения, то код передает исключение типа std::bad_alloc
. Выполнение всего последующего кода прекращается, пока ошибка не будет обработана в блоке try-catch или произойдет экстренное завершение программы. Программа не нуждается в проверке значения указателя; если не было передано исключение, то выделение прошло успешно. Реализованные операции определяются в заголовке <new>
. В большинстве реализаций C++ оператор new
также может быть перегружен для определения особого поведения.
Освобождение динамически выделенной памяти
Любая динамически выделенная память при помощи new
должна освобождаться при помощи команды delete
. Существует два варианта: один для массивов, другой — для единичных объектов.
int *p_var = new int;
int *p_array = new int[50];
delete[] p_array;
delete p_var;
Необходимо отметить, что компилятор не требует создания диагностического сообщения при некорректном использовании delete
; он в общем случае не может знать, когда указатель указывает на одиночный элемент, а когда — на массив элементов. Более того, использование не соответствующего освобождения по сути вызывает неопределённое поведение.
Повторное выделение памяти, выделенной при помощи new[]
В отличие от оператора realloc
в языке Си, при помощи new[]
невозможно напрямую повторно выделить уже выделенную память. Для увеличения или уменьшения размера блока памяти нужно выделить новый блок нужного размера, скопировать данные из старой памяти и удалить старый блок.
Стандартная библиотека языка C++ предусматривает поддержку динамического массива, который может быть увеличен или уменьшен в своем шаблоне std::vector
.
См. также
- Распределители памяти
- Delete (C++)
- Обработка исключений
malloc
- Пул памяти
- Синтаксис размещения
- Указатель
- Умный указатель
Примечания
</references>
Ссылки
Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....