Поделиться через


оператор new (C++)

Выделяет память для объекта или массив объектов имя типа из свободного хранилища и возвращает типизированный подходяще, если указатель на объект.

[::] new [placement] new-type-name [new-initializer]
[::] new [placement] ( type-name ) [new-initializer]

Заметки

Если операция завершилась неудачей, создать возвращает нуль или создает исключение. см. Новые и удаление операторов для получения дополнительных сведений.Можно изменить используемую по умолчанию применяются расширения функциональности путем написания пользовательская процедура обработки ошибок и вызвать _set_new_handler функции библиотеки времени выполнения с именем функции в качестве аргумента.

Дополнительные сведения о том, как создать объект в управляемой куче см. в разделе gcnew.

После создать используется, чтобы выделить память для объекта класса с++, конструктор объекта вызывается после того, как память выделяется.

Используйте удалить оператор к распределению освобождает память, выделенная с создать оператор.

В следующем примере выбираются а затем освобождает двумерный массив знаков размера dim 10.При выборе многомерный массив все измерения, за исключением первого должны быть выражением, результатом которых является постоянным для положительных значений; самое левое измерение массива может быть любым выражением, результатом которого является положительному значению.При выборе массив использование создать оператор первое измерения может быть нулевым. создать оператор получает уникальный указатель.

char (*pchar)[10] = new char[dim][10];
delete [] pchar;

Имя типа не может содержаться Const" volatileобъявления класса или объявления перечисления.Поэтому следующее выражение недопустимо.

volatile char *vch = new volatile char[20];

создать оператор не выделяет ссылочные типы, так как они не являются объектами.

создать оператор не может применяться для выбора функции, но его можно использовать для выбора указатели на функции.В следующем примере выбираются а затем освобождает массив 7 указателей на функции, которые возвращают целые числа.

int (**p) () = new (int (*[7]) ());
delete *p;

При использовании оператора создать без каких-либо дополнительных аргументов и компилировать с /GX" /EHaили /EHs параметр, компилятор создает код для вызова оператор удалить если конструктор вызывает исключение.

В следующем списке описаны элементы грамматики создать.

  • Размещение
    Предоставляет способ передачи дополнительных аргументов если перегружаете создать.

  • имя типа
    Определяет тип для выбора; может быть либо встроенным или пользовательским типом.Если спецификацию типа осложнял, она может быть окружена скобки для принудительного порядка привязки.

  • инициализатор
    Предоставляет значение для инициализированного объекта.Инициализаторы нельзя указать для массивов.создать оператор создает массивов объектов, только если класс имеет конструктор по умолчанию.

Пример

В следующем примере кода выбирает массив символов и объект класса 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;
}

Если используется размещение нового, фигуры создать оператор форма с аргументами в дополнение к размеру распределения, компилятор не поддерживает форма размещения удалить оператор если конструктор вызывает исключение.Примеры.

// 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