2017년 11월 23일 목요일

C++ 생성자 및 소멸자 강제 호출(malloc + free)


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)
 



댓글 없음:

댓글 쓰기