신입 게임 개발자의 프로그래밍 일기
[C++ 입문자에서 벗어나기]Chapter_4: 메모리(Memory)#3 본문
[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를 재정의하자!
'Language > C++' 카테고리의 다른 글
[C++ 입문자에서 벗어나기]Chapter_4: 메모리(Memory)#4 - 2 (0) | 2018.02.01 |
---|---|
[C++ 입문자에서 벗어나기]Chapter_4: 메모리(Memory)#4 - 1 (0) | 2018.01.27 |
[C++ 입문자에서 벗어나기]Chapter_4: 메모리(Memory)#2 (2) | 2018.01.09 |
[C++ 입문자에서 벗어나기]Chapter_4: 메모리(Memory)#1 (5) | 2017.12.11 |
ISO Cpp 게시글 Memory Management와 관련된 여러 질문들 (0) | 2017.12.11 |