class A { public: A() { cout << "constructure\n"; } A(int i) { cout << "constructure. i : " << i << "\n"; } ~A() { cout << "destructor\n"; } virtual void foo () { cout << "foo\n"; } };
A* p = static_cast<A*>(malloc(sizeof(A))); ///< 생성자를 호출하지 않고 객체 생성
new(p) A(11); ///< 생성자 호출(placement new), 이부분 빼면 크래쉬(가상함수 테이블이 초기화가 안되었기 때문에)
p->foo();
p->~A(); ///< 소멸자 호출
free(p); ///< 객체 제거
output
constructure. i : 11
foo
destructor
*숨겨진 생성자의 기능
-부모 클래스가 있다면 부모 클래스의 생성자 호출
-객체인 멤버변수들이 있다면 이들의 생성자 호출
-가상함수가 있을 경우 가상함수 테이블 초기화
#trivial(생성자를 호출할 필요가 없는)한 객체인가를 판단하는 함수 : is_trivially_default_constructible
#include <type_traits>
if(false == std::is_trivially_default_constructible<B>::value)
new(p) B(11); //< 생성자 호출(placement new)
댓글 없음:
댓글 쓰기