(C++) 8.6 소멸자 destructor

이준우·2021년 11월 23일
0

변수가 영역을 벗어나 사라질때,호출이 되는 함수를 의미한다.

이처럼 작성하는데, 소멸자 같은 경우에는 ~를 생성자 옆에 넣어 사용한다. 대신 소멸자는 매개변수를 갖지 않는다.

출력을 보면 Constructor0 -> Constructor1 -> Destructor1 -> Destructor0로 나오는 지 알아야 한다. 소멸자는 영역을 벗어나 사라질때 호출이 되는 함수 이므로, 이는 스택과 같은 기능을 하며 맨 위에 들어온 메모리부터 하나씩 호출한다.

즉 마지막에 들어온 메모리가 Constructor1에 대한 메모리 이므로 이에 대한 메모리를 먼저 없애다 보니 Destructor1이 출력되어 메모리가 사라지고 그다음 Destructor0이 나오는 것을 알 수 있다.


또한 이를 동적할당으로 선언하면 신기한 것을 알 수 있다. 신기하다기 보단 당연한 것인데, 이를 코드로 확인해보자.

이를 보면 s1이 먼저 Destructor이 나오는 것을 볼 수 있다. 그 이유는 동적할당 new는 delete를 만나기 전까지 메모리를 갖고 있기 때문이다. delete를 만나면 동적할당된 메모리가 사라지기 때문에, s1의 Destructor가 발생하는 것을 볼 수 있다.


근데 소멸자를 굳이 써야하는 이유가 뭘까?

C++에서 가장 많이 쓰는 방법은 delete 해주는 기능이다.

이와 같이 코드를 짜면 메모리 leak이 발생하는 것을 알 것이다. 이를 돌려보면 compiler 오류가 나는데 IntArray() 생성자 내의 {}에 cout을 넣어 출력해보면 무한적으로 돌아가는 것을 확인할 수 있다. 이런식으로 메모리 leak이 생기면 프로그램에 치명적인 문제를 발생시키기 때문에, 이러한 부분에 대한 방어책으로 사용하는 방법이 있다. 자세히는 안보이지만 코드만 다시 보면 이와 같이 구성하면 메모리 leak이 발생하지 않는다.

여기서 혹시 모른다는 생각을 갖는 개발자들은 조건문을 추가하여 작동시키는 방법도 있다.


또한, New와 delete는 속도가 느리다는 단점이 있기 때문에, 남용하는 버릇은 좋지 않다. vector같은 경우에는 vector 안에 delete와 같은 방식이 들어가 있기 때문에, 굳이 소멸자로 구현하지 않고 vector만 사용하면 쓰고 지우고 쓰고 지우고 방식이 가능하다.

0개의 댓글