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-name은 const, 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;
}