새 운영자 (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;
}