정체불명의 모모

[C++] placement new - 전용 new 본문

프로그래밍(c++)

[C++] placement new - 전용 new

정체불명의 모모 2021. 8. 5. 16:56

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++] placement new - 내가 원하는 메모리에 객체를 할당하고 싶다면

Placement new 내가 지정한 메모리에 객체를 초기화할 수 있을까? 메모리 풀을 만들다가 난항을 겪어 c++ 포럼에 질문을 남겼다가 새로운 기능을 알게 되었다. 그때 그때 생성할 객체의 타입이 달라

woo-dev.tistory.com

 

Comments