- New (C++)
-
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
. Все элементы массива инициализируются при помощи конструктора по умолчанию для данного типа. Если тип не имеет конструктора по умолчанию, то произойдет ошибка при компиляции.Placement new
Существует особая форма оператора new, называемая Placement new. Данный оператор не выделяет память и получает своим аргументом адрес на уже выделенную каким-либо образом память (например, на стеке или через malloc). Происходит размещение (инициализация) объекта путем вызова конструктора, и объект создается в памяти по указанному адресу.
Реализация
В компиляторах, придерживающимся стандарта 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++ предусматривает поддержку динамического массива, который может быть увеличен или уменьшен в своем шаблонном классе .См. также
- Распределители памяти
- Delete (C++)
- Обработка исключений
malloc
- Пул памяти
- Синтаксис размещения
- Указатель
- Умный указатель
Ссылки
-
Wikimedia Foundation. 2010.