C++

[C++] 가상 소멸자

스누징어 2022. 7. 2. 00:43

가상 소멸자

선행

* 동적 바인딩, 정적 바인딩에 대한 개념이 필요하다.

 

[C++] 동적 바인딩, 정적 바인딩

동적 정적 바인딩 사전 준비 * 먼저 다형성에 대한 개념을 알고 있어야 한다. https://licktwice.tistory.com/59https://licktwice.tistory.com/59 [JAVA]자바 - 다형성 Polymorphism 다형성 Polymorphism OOP의..

licktwice.tistory.com

 

 

소멸자도 함수

* 소멸자도 내부적으로는 함수와 같다.

  소멸자도 기본이 정적 바인딩이며, 이는 문제가 생길 수 있다.

 

 

정적 바인딩 소멸자

* 소멸자가 정적 바인딩인 상황에서

  부모 포인터형으로 소멸자를 호출자식 소멸자가 호출되지 않는다.

 

* 이는 메모리 누수가 나올 수 있는 큰 문제이다.

 

* 해결법은 소멸자를 동적 바인딩을 하면 된다.

 

 

동적 바인딩 소멸자

* 소멸자 앞에 virtual만 붙이면 된다.

  virtual은 상속되기 때문에 부모가 가상 소멸자이면

  자식들은 알아서 가상 소멸자이다.

 

* 소멸자가 동적 바인딩이어야

  언제나 자식 소멸자가 호출되고

  자식 소멸자가 부모 소멸자를 호출한다.

 

 

코드

// 정적 바인딩 소멸자
class Animal {
public:
	int mAge;
	Animal(int age) : mAge(age) {}
	~Animal() { cout << "부모 소멸자" << endl; }
};

class Dog :public Animal {
public:
	string mName;
	Dog(int age, string name) : Animal(age), mName(name) {}
	~Dog() { cout << "자식 소멸자" << endl; }
};

int main() {
	Dog* dog = new Dog(10, "까망이");
	Animal* animal = dog;
	delete animal;
	return 0;
}

* 정적 바인딩 소멸자

  부모 포인터형으로 delete를 하여, 부모 소멸자만 호출되었다.

 

 

// 동적 바인딩 소멸자
class Animal {
public:
	int mAge;
	Animal(int age) : mAge(age) {}
	virtual ~Animal() { cout << "부모 소멸자" << endl; }
};

class Dog :public Animal {
public:
	string mName;
	Dog(int age, string name) : Animal(age), mName(name) {}
	~Dog() { cout << "자식 소멸자" << endl; }
};

int main() {
	Dog* dog = new Dog(10, "까망이");
	Animal* animal = dog;
	delete animal;
	return 0;
}

* 동적 바인딩 소멸자

  부모 포인터형으로 delete를 해도,

  자식 소멸자, 부모 소멸자 모두 호출된다.

 

 

언제 사용하나

* 모든 클래스에 소멸자를 가상으로 만들 것을 추천한다.

 

* 가상 소멸자가 성능 상 느릴 수 있지만

  메모리 누수는 너무 큰 문제이고, 

  누군가 클래스를 상속받는 것을 막지 못하기 때문이다.

 

* 즉, 클래스를 상속하지 못하게 막을 것이 아니라면

  가상 소멸자로 하는 것을 추천한다.

 

 

 

 

 

 

 

 

 

 

귀여운 그림은 쭐어님이 그리셨습니다.

반응형