[C++] virtual 소멸자

강한·2025년 1월 13일

CPP

목록 보기
9/18
post-thumbnail

virtual 소멸자

  • 부모 클래스의 소멸자에 virtual 키워드를 명시하지 않으면 기본적으로 정적 바인딩(static binding)이 적용된다. 즉, Parent* 타입 포인터로 delete를 호출하면, 실제 객체 타입(Child)이 아닌 포인터의 타입(Parent)에 맞춰 부모 소멸자만 호출된다. 반면에 소멸자를 virtual로 선언하면, 동적 바인딩(dynamic binding)을 통해 실제 객체 타입에 맞춰 자식 소멸자가 먼저 호출되고, 그 후 부모 소멸자가 호출되는 올바른 순서가 보장된다.
class Player
{
public:
	Player() {
		cout << "Player()" << endl;
	}
	
	//virtual ~Player()
	~Player()
	{
		cout << "~Player()" << endl;
	}
};

class Pet
{
};

class Archer : public Player
{
public:
	Archer() {
		pet = new Pet();
		cout << "Archer()" << endl;
	}
	
	~Archer() {
		delete pet;
		cout << "~Archer()" << endl;
	}
private:
	Pet* pet;
};

int main() {
	
	Archer* archer1 = new Archer();
	delete archer;
	// 출력 결과
	// Player()
	// Archer()
	// ~Archer()
	// ~Player()
	
	Player* player = new Archer();
	delete player;
	// 출력 결과
	// Player()
	// Archer()
	// ~Player()

	while(true) {
		Player* player = new Archer();
		delete player;
	}
	// pet의 메모리가 계속 할당되고 해제되지 않아 메모리가 계속 증가
	
}

  • 부모 소멸자에 virtual 키워드를 붙이지 않으면, 자식 소멸자가 전혀 호출되지 않아 자식 클래스가 관리하던 자원(동적 메모리, 파일 핸들 등)이 제대로 해제되지 않는 문제가 발생할 수 있습니다.
profile
의지 강한 게임개발자

0개의 댓글