Оператор 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;
}

См. также

Ссылки

Выражения с унарными операторами

Ключевые слова в C++

Время жизни объектов, выделенных с помощью оператора new

Создание экземпляров объектов, выделенных с помощью оператора new

Принцип работы new

Функция оператор new