C++ Chapter 8.6 : 소멸자
카테고리: Cpp
태그: Cpp Programming
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!
chapter 8. 객체 지향의 기초 : 소멸자
🔔 생성자와의 차이점
소멸자
: 객체가 영역을 벗어나서 메모리에서 해제될 떄 자동으로 호출되는 함수생성자
는 객체가 메모리를 차지할 때, 즉 객체가 생성될 때 프로그래머가 직접 호출하는 함수라는 점에서 다르다.
🔔 소멸자가 호출되는 과정
- 소멸자는
~ 클래스이름()
으로 정의한다.- 소멸자는 인수를 받지 않는다. 매개 변수 없음.
- 소멸자는 자동으로 호출되는 함수이며 프로그래머가 직접 호출하는건 권장하지 않는다.
#include <iostream>
using namespace std;
class Simple
{
private:
int m_id;
public:
Simple(const int& id_in)
: m_id(id_in)
{
cout << "constructor" << m_id << endl;
}
~Simple() // ✨소멸자✨
{
cout << "Destructor" << m_id << endl;
}
};
int main()
{
Simple s1(0); // 생성자 호출, m_id = 0
Simple s2(1); // 생성자 호출, m_id = 1
return 0; // 영역을 벗어나면서 두 객체 모두 소멸자 호출
}
✨출력✨
Constructor 0
Constructor 1
Destructor 1
Destructor 0
- 객체가 s1, s2 이렇게 두 개 있는 상황에서 이들이 속한 영역인 main 함수가 종료될 때
- 객체 s1, s2가 메모리가 반납 되면서 이들의 소멸자가 자동으로 호출된다.
- 가장 나중에 만들어진 객체가 먼저 사라지므로 s2의 소멸자가 호출되어 “Destructor 1”가 먼저 출력된다.
- 스택 메모리를 사용하니까 가장 나중에 만들어진게 가장 먼저 삭제된다. 해당 포스트에 있는 그림 참고
🔔 소멸자 활용 방법
메모리를 동적 할당 받는 멤버가 있을 때 소멸자 안에서 이 멤버를
delete
해주면 메모리 누수를 방지할 수 있다.
#include <iostream>
using namespace std;
class IntArray
{
private:
int *m_arr = nullptr;
int m_length = 0;
public:
IntArray(const int& length_in)
{
m_length = length_in;
m_arr = new int[m_length]; // m_arr 멤버는 동적할당 받고 있다.
cout << "constructor" << endl;
}
~IntArray()
{
delete [] m_arr; // 객체 소멸시 m_arr 멤버는 해제해주기!
}
int getLength() {return m_length;}
};
int main()
{
while (true)
{
IntArray my_int_arr(10000);
}
return 0;
}
객체 생성시 m_arr 멤버는 메모리를 동적으로 할당 받는다. 이런 상황에서 만약 프로그래머가 실수로 delete
를 해주지 않는다면 객체를 무한으로 생성하는 중인 무한 루프문에서 메모리 누수가 생긴다. 소멸자에 m_arr 멤버를 delete
시키는 내용을 넣어준다면 while문 안에서 다음 반복으로 넘어갈 때마다 객체가 소멸되면서 소멸자가 호출되고 m_arr 멤버도 무사히 메모리를 해제될 것이다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글남기기