1. 개요
소멸자는 객체가 소멸될 때 자동으로 발생하는 메소드이다.
이것은 생명 주기가 다른 객체에 삽입되었거나 동적으로 할당돼서 명시적으로 풀려나는 경우에, 자신의 생명주기가 범위에 묶여있고 실행이 변수 영역을 떠날 때 발생한다.
소멸자의 주요 목적은 자원을 할당 놓는(free) 것이며(메모리 할당, 오픈된 파일이나 소켓들, 데이터베이스 연결들, 자원 락 등), 이것은 객체에 의해 다른 엔티티에서 등록된 것을 자신의 생명주기에 따라 획득된 것이다.
소멸자의 사용은 RAII(자원의 획득은 초기화이다: Resource Acquisition Is Initialization)의 개념에 필요하다.
쓰레기 수집 (컴퓨터 과학) 메커니즘을 사용하는 언어에서, 이것은 결정론적으로, 소멸자가 실행된다고 확신하기 힘들며, 그에 따라 이러한 언어들은 일반적으로 RII에 적합하지 않다고 여겨진다.
이러한 언어들에서 객체를 존재하는 자원에서 링킹 해제하는 것은 반드시 적절한 함수의 명시적인 호출에 의하여야 한다(주로 Dispose()의 호출에 의한). 이 방식은 또한 자원을 놓을 때 파이널라이저를 사용하는 것 대신 추천되는 방식이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Base { public: // 생성자 Base() { // TODO: } // 소멸자 키워드 ~Base() { // TODO: } }; | cs |
소멸자는 클래스와 같은 이름을 갖지만, 앞에 물결표(~)를 붙인다.
만약 객체가 자동 변수로 생성된다면, 소멸자는 자동적으로 이것이 변수 영역을 넘어섰을 때 호출된다.
객체가 new 표현식을 사용해서 생성되었다면, 이것의 소멸자는 delete 연산자가 객체에 대한 포인터에 적용될 때 호출된다. 보통 그 연산은 다른 소멸자 안에서 발생하는데, 이것은 일반적으로 스마트 포인터 객체이다.
상속 체계에서, 베이스 클래스에서의 가상 소멸자의 선언은 상속받은 클래스들의 소멸자들이 객체가 베이스를 가리키는 클래스를 통해 삭제되었을 때 적절히 호출된다는 것을 확신시켜 준다. 이 방식으로 삭제될 객체들은 가상 소멸자를 상속할 필요가 있다.
소멸자는 반드시 예외를 던지면 안된다.
클래스 내부 멤버 변수에서 동적으로 할당 메모리를 소멸자 이전이 소거 하지 않거나 소멸자가 호출 되는 시점에 소거하지 않으면 메모리릭이 발생 한다.
2. 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include <iostream> #include <sstream> #include <string> #include <algorithm> #include <functional> #include <vector> #include <list> #include <queue> #include <deque> #include <map> #include <set> #include <stack> #include <math.h> #include <memory.h> using namespace std; class Base { public: // 생성자 Base(string name) { // TODO: this->name = name; cout << name << " - 생성자 호출" << endl; } // 소멸자 키워드 ~Base() { // TODO: cout << name << " - 소멸자 호출" << endl; } private: string name; }; int main() { Base baseA("지역1"); { Base baseB("지역2"); } return 0; } | cs |
3. 출력 결과
1 2 3 | 지역1 - 생성자 호출 지역2 - 생성자 호출 지역2 - 소멸자 호출 | cs |
1 2 3 4 | 지역1 - 생성자 호출 지역2 - 생성자 호출 지역2 - 소멸자 호출 지역1 - 소멸자 호출 | cs |
Const 레퍼런스 전달 방식 (0) | 2020.06.22 |
---|---|
스마트포인터 (0) | 2020.06.22 |
네임스페이스 (0) | 2020.06.22 |
virtual inheritance in c++ (0) | 2019.09.05 |
STL VECTOR 오름차순, 내림차순 정렬 하기 (0) | 2018.08.21 |
댓글 영역