C++ Chapter 8.6 : 소멸자

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 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 멤버도 무사히 메모리를 해제될 것이다.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기


댓글남기기