개발/C, C++

2_new4_Placement new

huiyu 2014. 7. 23. 03:20
#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
반응형

'개발 > 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