정체불명의 모모
[C++] placement new - 전용 new 본문
Placement new
책을 보다 처음 보는 'placement new' 라는 것이 나왔다.
그냥 지나칠 수 있지만... 그냥 지나칠 수 없었다...
그럼.. 이제 파해쳐 보자!!!
참고한 링크는 아래에 달아 놓았습니다.
new 연산자는 기본적으로 C의 malloc 과 달리 메모리 할당 + 초기화를 수행 한다.
- 메모리 할당 : 해당 클래스 타입의 인스턴스를 저장할 공간을 할당 받는 것 입니다.
- 초기화 : 생성자를 호출함으로써 할당받은 메모리 공간에 인스턴스를 생성 및 초기화 합니다.
c++에서는 new의 이 두 과정을 분리하여 다룰 수 있다.
▽ placement new 기능
: 이 기능은 새롭게 힙 영역의 메모리를 가져다 쓰는 것이 아니라, 내가 사용하길 원하는 메모리 공간을 지정할 수 있다.
즉, 기존에 존재하던 메모리 공간을 활용할 수 있다.
class A {...};
class B {...};
A* pMemory = (A*)(pMemoryPool + head);
A* pA = new (pMemory) A; //placement new
new 와 타입 사이에 괄호와 함께 사용할 메모리 공간을 적어주면 된다.
그러면 A 타입의 인스턴스가 pMemory에 초기화 된다.
과정
1. 인스턴스를 생성 및 초기화할 공간으로 pMemory를 지정한다.
2. pMemory에 A의 생성자를 호출한다.
3. pMemory에 A의 인스턴스가 생성 및 초기화 된다.
4. pMemory를 pA에 저장한다.
※ !! 주의 !! placement new를 통해 생성된 객체는 delete로 지워선 안된다.
해당 객체의 소멸자를 직접 호출해야 한다.
그리고 당연히 스택 메모리에 생성된 배열은 사용할 수 없다.
https://woo-dev.tistory.com/217
'프로그래밍(c++)' 카테고리의 다른 글
[C++/STL] vector와 deque의 차이점 (0) | 2021.08.10 |
---|---|
[ C++] std::mutex를 통한 thread 동기화 (0) | 2021.08.05 |
[C++] std::allocator<T> 클래스 (0) | 2021.08.05 |
[스마트 포인터] Shared_ptr 알아보기(구현) (0) | 2021.07.15 |
[ C / C++ ] malloc( ) 와 new 의 차이점 (0) | 2021.07.05 |
Comments