IT 프로그래밍/C++

[C++] 가상 소멸자

기술1 2024. 5. 28. 13:47
반응형
class A
{
public:
	virtual void print() final { cout << "A" << endl; }
};

이렇게 final을 해주면 밑에서 override를 해주지 못하도록 막아버리는 것입니다. 이렇게 뒤면 밑에 override하는 것들이 다 막히는 것을 볼 수 있습니다. 

 

가상소멸

#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 = new Derived(5);
	Base* base = derived;
	delete base;

	return 0;
}

이렇게 할경우 메모리 누수가 발생하게 됩니다. Derived를 소멸자 작업을 하지 않았기 때문인데요.

 

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

여기서 ~Base를 virtual로 만들어주면 정상적으로 자식 소멸자가 실행되고 부모클래스가 실행이 되는 것을 볼 수 있습니다. 

반응형