다음을 통해 공유


<new> 연산자 및 열거형

enum align_val_t

enum class align_val_t : size_t {};

operator delete

개별 개체에 대한 delete 스토리지 할당을 취소하기 위해 식에서 호출하는 함수입니다.

void operator delete(void* ptr) noexcept;
void operator delete(void *, void*) noexcept;
void operator delete(void* ptr, const std::nothrow_t&) noexcept;

매개 변수

ptr
삭제에 의해 값이 무효 처리되는 포인터입니다.

설명

첫 번째 함수는 식에 delete 의해 호출되어 잘못된 값을 ptr 렌더링합니다. 프로그램은 C++ 표준 라이브러리를 통해 정의되는 기본 버전을 바꾸는 함수를 이 함수 시그니처로 정의할 수 있습니다. 필요한 동작은 이전 nullptr 호출에서 반환된 값을 ptr 수락하는 것입니다operator new.

ptrnullptr 기본 동작은 아무 작업도 수행하지 않는 것입니다. 다른 값은 ptr 앞에서 설명한 대로 호출에서 이전에 반환한 new 값이어야 합니다. null이 아닌 값의 ptr 기본 동작은 이전 호출에서 할당한 스토리지를 회수하는 것입니다. 이러한 회수된 스토리지의 일부 또는 전부가 후속 호출 operator new또는 callocmallocrealloc 함수에 의해 할당되는 조건에 따라 지정되지 않습니다.

두 번째 함수는 폼의 식에 해당하는 배치 delete 식에 new 의해 호출됩니다 new( std::size_t ). 아무 작업도 수행하지 않습니다.

세 번째 함수는 폼의 식에 해당하는 배치 delete 식에 new 의해 호출됩니다 new( std::size_t, const std::nothrow_t& ). 프로그램은 C++ 표준 라이브러리를 통해 정의되는 기본 버전을 바꾸는 함수를 이 함수 시그니처로 정의할 수 있습니다. 필요한 동작은 이전 nullptr 호출에서 반환되었거나 반환된 값을 ptr 수락하는 것입니다operator new. 기본 동작은 .를 평가하는 delete( ptr )것입니다.

예시

를 사용하는 operator delete예제를 참조하세요operator new.

operator delete[]

개체 배열에 delete 대한 스토리지 할당을 취소하기 위해 식에서 호출한 함수입니다.

void operator delete[](void* ptr) noexcept;
void operator delete[](void *, void*) noexcept;
void operator delete[](void* ptr, const std::nothrow_t&) noexcept;

매개 변수

ptr
삭제에 의해 값이 무효 처리되는 포인터입니다.

설명

첫 번째 함수는 ptr의 값을 무효 처리하기 위해 delete[] 식에 의해 호출됩니다. 프로그램은 C++ 표준 라이브러리를 통해 정의되는 기본 버전을 바꾸는 함수를 이 함수 시그니처로 정의할 수 있으므로 함수는 교체 가능합니다. 필요한 동작은 이전 nullptr 호출에서 반환되었거나 반환된 값을 ptr 수락하는 것입니다operator new[]. ptr의 null 값에 대한 기본 동작은 아무 작업도 수행하지 않는 것입니다. 기타 모든 ptr의 값은 앞에서 설명한 것처럼 호출을 통해 이전에 반환된 값이어야 합니다. null이 아닌 값의 ptr 기본 동작은 이전 호출에서 할당한 스토리지를 회수하는 것입니다. 이러한 회수된 스토리지의 일부 또는 전부가 후속 호출 operator new또는 callocmallocrealloc 함수에 의해 할당되는 조건에 따라 지정되지 않습니다.

두 번째 함수는 폼의 식에 해당하는 배치 delete[] 식에 new[] 의해 호출됩니다 new[]( std::size_t ). 아무 작업도 수행하지 않습니다.

세 번째 함수는 폼의 식에 해당하는 배치 delete[] 식에 new[] 의해 호출됩니다 new[]( std::size_t, const std::nothrow_t& ). 프로그램은 C++ 표준 라이브러리를 통해 정의되는 기본 버전을 바꾸는 함수를 이 함수 시그니처로 정의할 수 있습니다. 필요한 동작은 이전 nullptr 연산new[]자 호출에서 반환되었거나 반환된 값을 ptr 수락하는 것입니다. 기본 동작은 .를 평가하는 delete[]( ptr )것입니다.

예시

사용 예제를 참조 operator new[] 하세요 operator delete[].

operator new

개별 개체에 대해 스토리지를 할당하기 위해 new 식에서 호출되는 함수입니다.

void* operator new(std::size_t count);
void* operator new(std::size_t count, const std::nothrow_t&) noexcept;
void* operator new(std::size_t count, void* ptr) noexcept;

매개 변수

count
할당할 스토리지의 바이트 수입니다.

ptr
반환할 포인터입니다.

반환 값

새로 할당된 스토리지의 가장 낮은 바이트 주소에 대한 포인터입니다. 또는 ptr함수의 세 번째 형식을 사용하는 경우

설명

첫 번째 함수는 해당 크기의 개체를 new 나타내기 위해 적절하게 정렬된 스토리지 바이트를 할당 count 하기 위해 식에 의해 호출됩니다. 이 함수는 바꿀 수 있습니다. 즉, 프로그램에서 C++ 표준 라이브러리에 정의된 기본 버전을 대체하는 이 함수 시그니처를 사용하여 대체 함수를 정의할 수 있습니다.

필요한 동작은 요청된 대로 스토리지를 할당할 수 있는 경우에만 null이 아닌 포인터를 반환하는 것입니다. 이러한 각 할당에서는 할당된 다른 스토리지에서 스토리지를 분리하는 포인터가 생성됩니다. 연속 호출을 통해 할당되는 스토리지의 순서와 연속성은 지정되지 않습니다. 저장된 초기값은 지정되지 않습니다. 반환된 포인터는 할당된 스토리지의 시작(가장 낮은 바이트 주소)을 가리킵니다. 0이면 count 반환된 값이 함수에서 반환된 다른 값과 비교되지 않습니다.

기본 동작은 루프를 실행하는 것입니다. 루프 내에서 함수는 먼저 요청된 스토리지 할당을 시도합니다. 시도에 호출 malloc 이 포함되는지 여부는 지정되지 않습니다. 할당 시도가 성공하면 함수는 할당된 스토리지에 대한 포인터를 반환합니다. 그렇지 않으면 함수는 지정된 형식의 함수를 호출합니다 new_handler. 호출된 함수가 반환되면 루프는 반복됩니다. 요청된 스토리지 할당 시도가 성공하거나 호출된 함수가 반환되지 않을 때 루프가 종료됩니다.

형식 new_handler 함수의 필수 동작은 다음 작업 중 하나를 수행하는 것입니다.

  • 더 많은 스토리지를 할당 가능하도록 지정한 다음, 반환됩니다.

  • 또는 을(를) 호출합니다 abortexit.

  • 형식 bad_alloc의 개체를 throw합니다.

함수의 new_handler 기본 동작은 형식 bad_alloc의 개체를 throw하는 것입니다. 값은 nullptr 기본 new_handler 함수를 지정합니다.

연속 호출 operator new 에 의해 할당된 스토리지의 순서 및 연속성은 초기 값과 마찬가지로 지정되지 않습니다.

첫 번째 형식 operator new으로 할당된 스토리지를 해제하려면 .를 호출합니다 operator delete.

두 번째 함수는 배치 new 식에 의해 호출되어 해당 크기의 개체를 나타내기 위해 적절하게 정렬된 스토리지 바이트를 할당 count 합니다. 이 함수는 바꿀 수 있습니다. 즉, 프로그램에서 C++ 표준 라이브러리에 정의된 기본 버전을 대체하는 이 함수 시그니처를 사용하여 대체 함수를 정의할 수 있습니다.

기본 동작은 해당 함수가 성공하면 반환 operator new( count ) 하는 것입니다. 그 외의 경우 nullptr를 반환합니다.

두 번째 형식 operator new (즉, 반환 nullptr되지 않은 경우)에 의해 할당된 스토리지를 해제하려면 .를 호출합니다 operator delete.

세 번째 함수는 형식의 할당되지 않은 배치 new 식에 의해 호출됩니다 new ( ptr ) T. 여기서는 ptr 단일 개체 포인터로 구성됩니다. 알려진 주소에서 개체를 생성하는 데 유용할 수 있습니다. 함수에서 ptr을 반환합니다. 이 개체에서 소멸자를 명시적으로 호출해야 합니다.

할당되지 않은 배치 new를 호출하는 경우 호출 delete하지 마세요. 대신 개체의 소멸자를 호출한 후 필요한 경우 제공한 메모리에 대한 할당 취소자를 호출합니다.

throw 또는 throw하지 않는 동작new에 대한 자세한 내용은 The newdelete 연산자를 참조하세요.

예시

// new_op_new.cpp
// compile with: /EHsc
#include<new>
#include<iostream>

using namespace std;

class MyClass {
    int member{ 0 };
public:
    MyClass() {
        cout << "MyClass at 0x" << this << " constructed.\n";
    };

    ~MyClass() {
        cout << "MyClass at 0x" << this << " destroyed.\n";
    };
};

int main( )
{
    // The first form of new / delete
    MyClass* fPtr1 = new MyClass;
    delete fPtr1;

    // The second form (fail returns nullptr) of new / delete
    MyClass* fPtr2 = new(nothrow) MyClass[2];
    if (fPtr2)
        delete fPtr2;

    // The third form (non-allocating placement) of new / delete
    char x[sizeof(MyClass)]; // x is automatic
    MyClass* fPtr3 = new(&x[0]) MyClass;
    fPtr3->~MyClass(); // Requires explicit destructor call
    // no delete because x is on the stack
}

operator new[]

개체 배열에 대해 스토리지를 할당하기 위해 new 식에서 호출되는 할당 함수입니다.

void* operator new[](std::size_t count);
void* operator new[](std::size_t count, const std::nothrow_t&) noexcept;
void* operator new[](std::size_t count, void* ptr) noexcept;

매개 변수

count
배열 개체에 대해 할당할 스토리지의 바이트 수입니다.

ptr
반환할 포인터입니다.

반환 값

새로 할당된 스토리지의 가장 낮은 바이트 주소에 대한 포인터입니다. 또는 ptr세 번째 폼을 사용하는 경우

설명

첫 번째 함수는 count 바이트의 스토리지를 할당하기 위해 new[] 식에서 호출되며, 해당 크기 이하의 모든 개체를 나타내도록 적절하게 정렬됩니다. 프로그램은 C++ 표준 라이브러리를 통해 정의되는 기본 버전을 바꾸는 함수를 이 함수 시그니처로 정의할 수 있습니다. 필요한 동작은 에 대한 operator new동작과 동일합니다. 기본 동작은 성공하면 반환 operator new( count ) 하는 것입니다. 그렇지 않으면 예외(또는 파생된 예외)를 std::bad_allocthrow합니다std::bad_alloc. 이 형식으로 할당된 스토리지를 operator new[]해제하려면 .를 호출합니다 operator delete[].

두 번째 함수는 count 바이트의 스토리지를 할당하기 위해 placement new[] 식에서 호출되며, 해당 크기의 모든 배열 개체를 나타내도록 적절하게 정렬됩니다. 프로그램은 C++ 표준 라이브러리를 통해 정의되는 기본 버전을 바꾸는 함수를 이 함수 시그니처로 정의할 수 있습니다. 기본 동작은 해당 함수가 성공하면 반환 operator new( count ) 하는 것입니다. 그 외의 경우 nullptr를 반환합니다. 이 형식으로 할당된 스토리지를 operator new[]해제하려면 .를 호출합니다 operator delete[]. throw 또는 throw하지 않는 동작new에 대한 자세한 내용은 The newdelete 연산자를 참조하세요.

세 번째 함수는 형식의 할당되지 않은 배치 new[] 식에 의해 호출됩니다 new( ptr ) T[ N ]. 이 양식은 메모리를 할당하지 않습니다. 매개 변수를 통해 전달된 메모리의 개체를 생성합니다 ptr . 함수에서 ptr을 반환합니다. 생성된 각 개체에 대해 소멸자를 명시적으로 호출해야 합니다. 에 충분한 메모리 ptr를 제공할 책임이 있습니다. 식에서 반환 new 된 값에 대해 호출 delete[] 하지 마세요. 대신, 소멸자를 호출한 후 필요한 경우 할당을 취소 ptr합니다.

예제

// new_op_array.cpp
// compile with: /EHsc
#include <new>
#include <iostream>

using namespace std;

class MyClass {
    int member{ 0 };
public:
    MyClass() {
        cout << "MyClass at 0x" << this << " constructed.\n";
    };

    ~MyClass() {
        cout << "MyClass at 0x" << this << " destroyed.\n";
    };
};

int main() {
    // The first form of array new / delete
    MyClass* fPtr1 = new MyClass[2];
    delete[] fPtr1;

    // The second form (fail returns nullptr) of array new / delete
    MyClass* fPtr2 = new(nothrow) MyClass[2];
    if (fPtr2)
        delete[] fPtr2;

    // The third form (non-allocating placement) of array new / delete
    char x[2 * sizeof(MyClass) + sizeof(int)]; // x is automatic

    MyClass* fPtr3 = new(&x[0]) MyClass[2];
    fPtr3[1].~MyClass(); // Requires explicit destructor calls
    fPtr3[0].~MyClass(); // Recommended in reverse construction order
    // Don't delete[] fPtr3 here.
    // delete[] &x[0] not required because x is on the stack
}