목록

2019년 6월 15일 토요일

[C++] 특정 메모리에 대해서 생성자 수동 호출



특정 메모리에 대해서 생성자를 수동으로 호출 할 수 있습니다.

경우에 따라 위험할 수 있으니, 생성자, 소멸자 호출 시점을
잘 아시는 분만 사용하시길 권합니다.


사용 방법
new(주소) 타입(생성자 매개변수 리스트);


사용 예


  1. #include <string>
  2. #include <iostream>
  3. using namespace std;
  4. class A
  5. {
  6.         std::string str;
  7. public:
  8.         A()
  9.         {
  10.                cout << "call A()\n";
  11.         }
  12.         ~A()
  13.         {
  14.                cout << "call ~A()\n";
  15.         }
  16. };
  17. int main()
  18. {
  19.        {
  20.             char buffer[sizeof(A)]; //버퍼의 크기는 적어도 A의 크기보다 커야 문제가 발생하지 않는다.
  21.             A* a = new(buffer) A; //buffer 메모리에 대해서 생성자 수동 호출
  22.             a->~A(); //buffer A타입이 아니기 때문에 블록이 끝날 때
  23.             //A의 소멸자가 자동으로 호출되지 않으므로 사용이 끝나면 수동으로 소멸자를 호출해 주어야 함
  24.         }
  25.         {
  26.             A a;
  27.             a.~A();  // 생성자 호출 전에 기존 객체의 소멸자를 호출해 주지 않으면 메모리 릭이 일어난다.
  28.             new(&a) A; //a 주소에 A클래스 생성자 수동 호출
  29.             //a A클래스 이므로 블록이 끝날 때 ~A 가 자동으로 호출 됨
  30.         }
  31. }


실제로 STL 에서도 많이 사용되고 있습니다.
디버깅 하다보면 vector 등의 컨테이너에서 볼 수 있을 것임

댓글 없음:

댓글 쓰기

목록