다음을 통해 공유


new 연산자 (C++)

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

참고

Microsoft C++ 구성 요소 확장은 vtable 슬롯 항목을 추가하기 위해 new 키워드에 대한 지원을 제공합니다.자세한 내용은 새 (새 vtable의에서 슬롯)를 참조하십시오.

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

설명

실패할 경우 new는 0을 반환하거나 예외를 throw합니다. 자세한 내용은 new 및 delete 연산자를 참조하십시오. 사용자 지정 예외 처리 루틴을 작성하고 함수 이름을 인수로 사용하여 _set_new_handler 런타임 라이브러리 함수를 호출하면 이 기본 동작을 변경할 수 있습니다.

관리되는 힙에서 개체를 만드는 방법에 대한 자세한 내용은 gcnew를 참조하십시오.

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

new 연산자로 할당한 메모리를 할당 해제하려면 delete 연산자를 사용하십시오.

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

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

type-nameconst, volatile, 클래스 선언 또는 열거형 선언을 포함할 수 없습니다. 따라서 다음 식은 올바르지 않습니다.

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

참조 형식은 개체가 아니므로 new 연산자는 참조 형식을 할당하지 않습니다.

new 연산자를 사용하여 함수를 할당할 수 없지만 함수에 대한 포인터를 할당할 수는 있습니다. 다음 예제에서는 정수를 반환하는 함수에 대한 7개의 포인터 배열을 할당한 다음 해제합니다.

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

추가 인수 없이 new 연산자를 사용하고 /GX, /EHa 또는 /EHs 옵션을 사용하여 컴파일하는 경우 생성자가 예외를 throw하면 컴파일러가 delete 연산자를 호출하기 위한 코드를 생성합니다.

다음 목록에서는 new의 문법 요소에 대해 설명합니다.

  • placement
    new를 오버로드하는 경우 추가 인수를 전달하는 방법을 제공합니다.

  • type-name
    기본 제공 또는 사용자 정의 형식 중에서 할당할 형식을 지정합니다. 형식 사양이 복잡한 경우 괄호로 묶어 바인딩 순서를 강제로 지정할 수 있습니다.

  • initializer
    초기화된 개체의 값을 제공합니다. 배열에 대한 이니셜라이저는 지정할 수 없습니다. 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 연산자의 새 배치 형태를 사용하는 경우 생성자가 예외를 throw하면 컴파일러가 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 작동 방식

operator new 함수