신입 게임 개발자의 프로그래밍 일기

[C++ 입문자에서 벗어나기]Chapter_4: 메모리(Memory)#3 본문

Language/C++

[C++ 입문자에서 벗어나기]Chapter_4: 메모리(Memory)#3

KFGD 2018. 1. 26. 09:04

[C++ 입문자에서 벗어나기]Chapter_4: 메모리(Memory)#3



void* operator new(std::size_t count) throw(bad_alloc);

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

void* operator new(std::size_t count,
    void* ptr) throw();

<참고: Microsoft Developer Network의 <new> operator 글>


이전 포스팅에서 'std::bad_alloc을 던지는 첫번째 new'에 대해 알아봤으니 

이번 포스팅에서는 '예외를 던지지 않는 new'와 'placement new(위치 지정 new)'에 대해 알아보겠습니다.


[예외를 던지지 않는 new]


std::bad_alloc 예외를 던지는 new와 예외를 던지지 않는 new가 따로 존재하는 이유는 뭘까요?

그 이유는 'Effective C++ 3판의 항목 49: new 처리자의 동작 원리를 제대로 이해하자'의 지문 중 일부를 요약하는 것으로 설명을 대신하겠습니다.


1. 이미 많은 컴파일러들이 널 반환 new로 구현을 해 놓은 상태였다.

2. C++ 표준화 위원회도 '널 포인터 점검' 기반의 코드를 버리고 싶지 않았다.


그럼, 어떻게 이 new는 사용할 수 있는 지를 간단한 예제 코드를 작성해보고 예외를 던지지 않는 new은 넘어가겠습니다.



결과는 주석에 적혀있는 것처럼 첫번째 new 할당은 실패하고 두번째 new 할당은 성공합니다.


[Placement new(위치 지정 new)]


placement new는 이미 할당받은 메모리 영역에서 생성자만 호출하고 싶은 경우에 사용하는 new입니다.

바로 예시 코드를 작성해보겠습니다.

아래 코드는 char*로 할당받은 메모리를 다른 용도로 사용하는 코드입니다.



Placement new의 사용법(구문)은 아래와 같습니다.


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

<참고: Microsoft Developer Network의 new 연산자(C++) 글>


더 간략하게 이야기하면  "new (생성자를 호출할 메모리 블록의 포인터) 생성자" 입니다.

이것으로 C++ 표준에서 제공하는 세가지 new에 대해 간단하게 살펴보았습니다.

다음 포스팅에서는 아래에 나열한 것들을 다뤄보겠습니다.


1. new와 delete를 재정의할 때 따르는 관례들

2. new 재정의 시 유의사항: 이름 가림

3. new를 재정의하면 그에 맞는 delete를 재정의하자!

Comments