C++ Chapter 12.4 : 가상 소멸자

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


chapter 12. 가상 함수들 : 가상 소멸자

🔔 가상 소멸자를 사용하기 전

#include <iostream>
using namespace std;

class Base
{
public:
	~Base()
	{
		cout << "~Base()" << endl;
	}
};

class Derived : public Base
{
private:
	int *m_array; 

public:
	Derived(int length)
	{
		m_array = new int[length];
	}

	~Derived()  
	{
		cout << "~Derived()" << endl;
		delete[] m_array;
	}
};

int main()
{
	Derived derived(5);

	return 0;
}
💎출력💎

~Derived()
~Base()
  • 생성자 호출 순서와 다르게 소멸자는
    • 자식 소멸자가 먼저 호출되고 그 다음에 부모 소멸자가 호출된다.
    • 제일 조상일 수록 가장 마지막에 소멸 됨.
int main()
{
	Derived * derived = new Derived(5); // 동적 할당
    Base * base = derived;  // 다형성, 동적할당
    delete base;

	return 0;
}
💎출력💎

~Base()
  • delete base
    • 부모인 Base 타입인 base는 자식인 Derived 타입의 derived 객체를 참조하고 있다.
    • 이때 base를 delete시켜주면 Derived 소멸자는 호출 되지 않고 부모인 Base 소멸자만 호출된다.

자식을 지우면 (자식 소멸자 👉 부모 소멸자) 순으로 부모 소멸자까지 호출되지만, 부모를 지우면 부모 소멸자만 호출되며 자식 소멸자는 호출되지 않는다.(상속에 있어 부모는 자식을 다 포함하지 않으므로 당연한 얘기!)

  • 소멸자도 자식들 본연의 소멸자들이 각각 다르게 호출되야 한다.
    • 일일이 delete 자식1, delete 자식2, … 해줄 수도 없고 😱
    • 자식 객체 내용물 중 동적 할당 받은 부분이 있어 이는 delete 되지 않으면 메모리 누수 문제가 생길 수 있다.


🔔 가상 소멸자 virtual

소멸자에 virtual을 붙여주면 부모 타입으로 자식 객체를 참조해도 자식 객체의 소멸자를 호출 시킨다. 가상 함수와 비슷.

#include <iostream>
using namespace std;

class Base
{
public:
	virtual ~Base()
	{
		cout << "~Base()" << endl;
	}
};

class Derived : public Base
{
private:
	int *m_array; 

public:
	Derived(int length)
	{
		m_array = new int[length];
	}

	~Derived()  
	{
		cout << "~Derived()" << endl;
		delete[] m_array;
	}
};

int main()
{
	Derived * derived = new Derived(5); // 동적 할당
    Base * base = derived;  // 다형성, 동적할당
    delete base;

	return 0;
}
💎출력💎

~Derived()
~Base()
  • virtual ~Base() : 가상 소멸자
    • 마찬가지로 Derived의 소멸자 ~Derived()도 virtual 속성을 물려받게 된다.
  • delete base
    • 이제 원래대로 먼저 자식 소멸자가 호출되며 뒤이어 부모 소멸자가 호출된다.
	~Derived() override
	{
		cout << "~Derived()" << endl;
		delete[] m_array;
	}
  • 자식 소멸자에 override를 붙일 수 있는데 이 경우엔 꼭 부모 소멸자에 virtual을 붙여주어야 한다.
    • 부모 소멸자가 가상 소멸자가 아니라면 자식 소멸자에 override를 붙일 수 없다.


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

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기