특정 메모리에 대해서 생성자를 수동으로 호출 할 수 있습니다.
경우에 따라 위험할 수 있으니, 생성자, 소멸자 호출 시점을
잘 아시는 분만 사용하시길 권합니다.
사용 방법
new(주소) 타입(생성자 매개변수 리스트);
사용 예
- #include <string>
- #include <iostream>
- using namespace std;
- class A
- {
- std::string str;
- public:
- A()
- {
- cout << "call A()\n";
- }
- ~A()
- {
- cout << "call ~A()\n";
- }
- };
- int main()
- {
- {
- char buffer[sizeof(A)]; //버퍼의 크기는 적어도 A의 크기보다
커야 문제가 발생하지 않는다.
- A* a = new(buffer) A; //buffer 메모리에 대해서 생성자 수동 호출
- a->~A();
//buffer가 A타입이 아니기 때문에 블록이
끝날 때
- //A의 소멸자가 자동으로 호출되지 않으므로 사용이 끝나면 수동으로 소멸자를 호출해
주어야 함
- }
- {
- A a;
- a.~A(); // 생성자 호출 전에 기존 객체의 소멸자를 호출해 주지 않으면 메모리 릭이 일어난다.
- new(&a) A; //a 주소에 A클래스 생성자 수동 호출
- //a가 A클래스 이므로 블록이 끝날
때 ~A 가 자동으로 호출 됨
- }
- }
|
실제로 STL 에서도 많이 사용되고 있습니다.
디버깅 하다보면 vector 등의 컨테이너에서 볼 수 있을 것임
댓글 없음:
댓글 쓰기