다음을 통해 공유


새 운영자 (C++)

개체 또는 개체의 배열에 대해 메모리를 할당 형식 이름 에서 사용 가능한 저장 하 고 개체를 적절 하 게 형식화 된, 0이 아닌 포인터를 반환 합니다.

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

설명

실패 하면 ; 예외를 throw 하거나 0 반환 참조 하십시오 의 새로운 운영자를 삭제 하 고 에 대 한 자세한 내용은.사용자 지정 예외 처리 루틴을 작성 하 고 호출 하 여이 기본 동작을 변경할 수는 _set_new_handler 런타임 라이브러리 함수를 함수 이름 인수로 사용 합니다.

관리 되는 힙에서 개체를 만드는 방법에 대 한 자세한 내용은 gcnew.

되는 메모리를 할당 한 후 C++ 클래스 개체에 대 한 메모리 할당을 사용 하면 개체의 생성자가 호출 됩니다.

사용은 삭제 연산자를 사용 하 여 할당 된 메모리의 할당을 취소 하는 연산자입니다.

다음 예제에서는 할당 하 고 다음 문자 크기를 2 차원 배열 해제 dim 10.다차원 배열을 할당 하는 경우 첫 번째 제외한 모든 치수를 양수 값으로 평가 되는 상수 식 이어야 합니다. 왼쪽 배열 차원의 양수 값을 반환 하는 식이 될 수 있습니다.사용 하 여 배열을 할당 하는 경우는 연산자가 첫 번째 차원에는 0이 될 수 있습니다-는 연산자는 고유한 포인터를 반환 합니다.

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 옵션을 컴파일러 연산자를 호출 하는 코드를 생성 합니다 삭제 생성자에서 예외를 throw 하는 경우.

다음의 문법 요소입니다 :

  • 배치
    로드 하는 경우 추가 인수를 전달 하는 방법을 제공 .

  • 형식 이름
    할당 될 수 있는 형식을 지정 합니다. 이 기본 제공 또는 사용자 정의 형식이 될 수 있습니다.형식 사양이 복잡 한 경우 바인딩 순서를 사용 하도록 괄호로 묶어 사용할 수 있습니다.

  • 이니셜라이저
    초기화 된 개체에 대 한 값을 제공합니다.배열에 대 한 이니셜라이저를 지정할 수 없습니다.해당 연산자만 해당 클래스에 기본 생성자가 있는 경우 개체의 배열을 만들 수 있습니다.

예제

다음 코드 예제는 문자 배열 및 클래스 개체를 할당 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;
}

배치 새 양식을 사용할 경우는 연산자, 컴파일러는 할당 크기 외에 인수 형식의 지원 하지 않습니다의 배치 형식에 삭제 생성자가 예외를 throw 하는 경우 연산자.예를 들면 다음과 같습니다.

// 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 + + 키워드

새로운 할당 된 개체의 수명

개체를 초기화 하는 동안 할당 새로운

새로운 작동

연산자 새 함수