Оператор new (C++)
Выделяет память для объекта или массива объектов имя-типа из свободного хранилища и возвращает подходящим образом типизированный ненулевой указатель на объект.
Примечание
Расширения компонентов Microsoft C++ обеспечивают поддержку ключевого слова new для добавления записей слота vtable.Дополнительные сведения см. в разделе new (new слот в vtable).
[::] new [placement] new-type-name [new-initializer]
[::] new [placement] ( type-name ) [new-initializer]
Заметки
Если операция завершилась неудачей, new возвращает ноль или создает исключение; дополнительные сведения см. в разделе Операторы new и delete. Можно изменить эту реакцию на событие по умолчанию, можно создать пользовательскую процедуру обработки исключений и вызова функции библиотеки времени выполнения _set_new_handler вместе с именем функции в качестве аргумента.
Дополнительные сведения о создании объекта в управляемой куче см. в разделе gcnew.
Если new используется, чтобы выделить память для объекта класса C++, конструктор объекта вызывается после выделения памяти.
Используйте оператор delete для отмены памяти, выделенной с помощью оператора new.
В следующем примере выделяется и затем освобождается двумерный массив символов размером dim на 10. При выделении многомерного массива все измерения, кроме первого, должны быть константными выражениями, которые возвращают положительные значения; самое левое измерение массива может являться любым выражением, результатом которого является положительное значение. При выделении массива с использованием оператора new первое измерение может быть нулевым — оператор new возвращает уникальный указатель.
char (*pchar)[10] = new char[dim][10];
delete [] pchar;
Имя-типа не может содержать константу, volatile объявления класса или объявления перечислений. Таким образом, следующее выражение является недопустимым:
volatile char *vch = new volatile char[20];
Оператор new не выделяет ссылочные типы, поскольку они не являются объектами.
Оператор new невозможно использовать для выделения функции, но его можно использовать для выделения указателей на функции. В следующем примере выделяется и затем освобождается массив из семи указателей на функции, которые возвращают целые числа.
int (**p) () = new (int (*[7]) ());
delete *p;
Если оператор new используется без дополнительных аргументов и компиляция производится с параметром /GX, /EHa или /EHs, компилятор создаст код, вызывающий оператор delete, если в конструкторе возникнет исключение.
В следующем списке представлены грамматические элементы new.
размещение
Предоставляет способ передачи дополнительных аргументов при перегрузке new.имя-типа
Определяет тип для распределения; может быть встроенным или пользовательским типом. Если спецификация типа является сложной, она может быть окружена круглыми скобками, чтобы принудительно реализовать порядок привязки.инициализатор
Предоставляет значение для инициализированного объекта. Инициализаторы невозможно задать для массивов. Оператор new создает массив объектов, только если класс имеет конструктор по умолчанию.
Пример
В следующем примере кода выделяется и освобождается массив символов и объект класса CName.
// expre_new_Operator.cpp
// compile with: /EHsc
#include <string.h>
class CName {
public:
enum {
sizeOfBuffer = 256
};
char m_szFirst[sizeOfBuffer];
char m_szLast[sizeOfBuffer];
public:
void SetName(char* pszFirst, char* pszLast) {
strcpy_s(m_szFirst, sizeOfBuffer, pszFirst);
strcpy_s(m_szLast, sizeOfBuffer, pszLast);
}
};
int main() {
// Allocate memory for the array
char* pCharArray = new char[CName::sizeOfBuffer];
strcpy_s(pCharArray, CName::sizeOfBuffer, "Array of characters");
// Deallocate memory for the array
delete [] pCharArray;
pCharArray = NULL;
// Allocate memory for the object
CName* pName = new CName;
pName->SetName("Firstname", "Lastname");
// Deallocate memory for the object
delete pName;
pName = NULL;
}
При использовании новой формы размещения оператора new, формы с аргументами в дополнение к размеру выделения, компилятор не поддерживает форму размещения оператора delete, если конструктор вызывает исключение. Например:
// expre_new_Operator2.cpp
// C2660 expected
class A {
public:
A(int) { throw "Fail!"; }
};
void F(void) {
try {
// heap memory pointed to by pa1 will be deallocated
// by calling ::operator delete(void*).
A* pa1 = new A(10);
} catch (...) {
}
try {
// This will call ::operator new(size_t, char*, int).
// When A::A(int) does a throw, we should call
// ::operator delete(void*, char*, int) to deallocate
// the memory pointed to by pa2. Since
// ::operator delete(void*, char*, int) has not been implemented,
// memory will be leaked when the deallocation cannot occur.
A* pa2 = new(__FILE__, __LINE__) A(20);
} catch (...) {
}
}
int main() {
A a;
}
См. также
Ссылки
Выражения с унарными операторами
Время жизни объектов, выделенных с помощью оператора new
Создание экземпляров объектов, выделенных с помощью оператора new