placement new
라고 한다.new (MemAddr) ClassType(parameter);
#include<cstdio>
#include<memory>
class ExamClass {
public:
ExamClass(int idIN) : id(idIN) {}
~ExamClass() { printf("class ID.%d deleted!\n", id); }
int id;
virtual void PrintClassID() const {
printf("class ID: %d\n", id);
}
};
int main() {
char* MemoryPool = new char[sizeof(ExamClass)*10];
ExamClass* MemPoolBaseAddr = (ExamClass*)MemoryPool;
for (int i = 0; i < 10; i++) {
new (MemPoolBaseAddr + i) ExamClass(i*10+1);
// 메모리 할당이 직접 일어나는 것이 아닌 내가 원하는 위치에 바로 객체값만 생성 가능
}
for (int i = 0; i < 10; i++) {
(MemPoolBaseAddr+i)->PrintClassID();
// 함수 실행도 잘 된다.
}
for (int i = 0; i < 10; i++) {
(MemPoolBaseAddr + i)->~ExamClass();
// 해제할때는 delete가 아닌 명시적으로 소멸자를 호출해줘야 한다.
}
delete[] MemoryPool;
return 0;
}
instance.ExamClass(); //=> 컴파일 에러
placement new
를 도입했다.heap fragmentation
이라는 현상이 발생한다.external fragmentation
과 유사함)아래 링크를 참조해주세요!