#include <iostream> using namespace std; class Point { int x, y; public: Point() { cout << "Point()" << endl; } ~Point(){ cout << "~Point()" << endl;} }; int main() { Point p1; p1.Point(); // error. 생성자는 명시적 호출이 안된다. p1.~Point(); }
위의 예제에서 p1의 생성자는 명시적으로 호출이 안되는 것을 볼 수 있다.
그렇다면 생성자를 호출하기 위해서는 어떻게 할까?
다음과 같이 하면된다.
new(&p1) Point;
placement new는 new연산자 다음에 특정 주소 영역을 넘기면 그 주소에 객체가 생성이 된다.
일반 new는 새로 생성한 메모리의 주소를 리턴하게 되어있는데, placement new는 처음부터 할당된 메모리 주소를 인자로 한다.
void* operator new( size_t sz, void* p) { return p; }
placement new는 새 메모리를 생성하지 않고, 인자로 받은 메모리 주소 공간에 객체를 맵핑 시킨다. 메모리를 생성하지 않는 것 말고는 일반적인 new와 동작이 같다.
생성자를 호출하고, 가상함수가 있다면 가상테이블을 초기화한다.
위 placement new는 이미 C++표준에서 제공하고 있습니다.
728x90
'Software Development > C, C++' 카테고리의 다른 글
3_Decay (0) | 2014.07.23 |
---|---|
2_new_정리 (0) | 2014.07.23 |
2_new3_nothrow (0) | 2014.07.23 |
2_new2_예제 (0) | 2014.07.21 |
2_new1_new,operator new, operator delete (0) | 2014.07.20 |