다음을 통해 공유


operator new 함수

프로그램에서 다음과 같은 문이 발견될 경우, operator new 함수가 호출됩니다.

설명

char *pch = new char[BUFFER_SIZE];

저장소의 0바이트가 요청될 경우 operator new는 명확한 개체 포인터를 반환합니다. 즉, operator new에 대한 반복 호출을 통해 다른 포인터를 반환합니다. 할당 요청을 위한 충분한 메모리가 없을 경우 operator newNULL을 반환하거나 예외를 throw합니다. 자세한 내용은 new 및 delete 연산자를 참조하십시오.

여유 메모리를 확보하는 루틴을 작성한 다음 할당을 다시 시도할 수도 있습니다. 자세한 내용은 _set_new_handler를 참고하십시오. 복구 체계에 대한 자세한 내용은 다음 항목, 부족한 메모리 조건 처리를 참조하십시오.

다음 표에는 operator new 함수의 두 범위가 설명되어 있습니다.

operator new 함수의 범위

연산자

범위

::operator new

전역

class-name::operator new

클래스

operator new의 첫 번째 인수는 size_t 형식(STDDEF.H에 정의된 형식)이어야 하며 반환 형식은 항상 **void ***입니다.

전역 operator new 함수를 사용하여 new 연산자가 기본 제공 형식의 개체, 즉 사용자 정의된 operator new 함수를 포함하지 않는 클래스 형식의 개체 및 모든 형식의 배열을 할당할 때 호출됩니다, new 연산자를 사용하여 클래스 형식의 개체를 operator new가 정의되는 지점에 할당할 때 클래스의 operator new가 호출됩니다.

클래스에 대해 정의된 operator new 함수는 해당 클래스 형식 개체의 전역 operator new 함수를 숨기는 정적 멤버 함수입니다(가상은 될 수 없음). 메모리를 지정된 값에 할당하고 설정하기 위해 new 연산자가 사용되는 경우를 다음의 예제를 통해 살펴보십시오.

// spec1_the_operator_new_function1.cpp
#include <malloc.h>
#include <memory.h>

class Blanks
{
public:
    Blanks(){}
    void *operator new( size_t stAllocateBlock, char chInit );
};
void *Blanks::operator new( size_t stAllocateBlock, char chInit )
{
    void *pvTemp = malloc( stAllocateBlock );
    if( pvTemp != 0 )
        memset( pvTemp, chInit, stAllocateBlock );
    return pvTemp;
}
// For discrete objects of type Blanks, the global operator new function
// is hidden. Therefore, the following code allocates an object of type
// Blanks and initializes it to 0xa5
int main()
{
   Blanks *a5 = new(0xa5) Blanks;
   return a5 != 0;
}

new의 괄호 안 인수는 chInit 인수로서 Blanks::operator new에 전달됩니다. 그러나 전역 operator new 함수가 숨겨져 있기 때문에 다음과 같은 오류를 생성하는 코드가 발생할 수 있습니다.

Blanks *SomeBlanks = new Blanks;

Visual C++ 5.0 이전 버전에서 new 연산자를 통해 할당된 비클래스 형식 및 모든 배열(클래스 형식인지 여부에 상관없음)은 항상 전역 operator new 함수를 사용했습니다.

Visual C++ 5.0 이후부터 컴파일러는 클래스 선언에서 멤버 배열, newdelete 연산자를 지원합니다. 예를 들면 다음과 같습니다.

// spec1_the_operator_new_function2.cpp
class MyClass
{
public:
   void * operator new[] (size_t)
   {
      return 0;
   }
   void   operator delete[] (void*)
   {
   }
};

int main() 
{
   MyClass *pMyClass = new MyClass[5];
   delete [] pMyClass;
}

참고 항목

참조

operator delete 함수

new 연산자 (C++)

delete 연산자 (C++)