2014-01-19 2 views
1

다른 클래스에서 상속받은 클래스가 있다고 가정하고 기본 클래스 지점에서 파생 클래스 객체로 포인터를 만듭니다. 이제 기본 클래스 소멸자가 가상으로 정의 된 경우 문제가 발생하지 않습니다. 그러나, 제 경우에는 기본 클래스 소멸자가 가상으로 선언되지 않았으므로이 포인터를 삭제하면 메모리 누수가 발생합니다.가상 클래스가 아닌 기본 클래스에서 소멸자를 호출하는 방법은 무엇입니까?

기본 클래스 코드를 수정하지 않고 어떻게이 문제를 해결할 수 있습니까?

+0

더 많은 코드를 표시하십시오. 특히 데이터를 파기하는 코드를 보여줍니다 (사용자의 선택 여부가 명확하지 않음). –

+0

상속 대신 컴포지션을 사용할 수 있습니다. – soon

답변

2

당신이 유형 Derived의 객체를 가리키는 (가상 소멸자가없는) 형 Base*의 포인터를 의미하고, 그 삭제를 가정.

이 상황을 처리하는 간단한 방법은 std::shared_ptr과 같은 스마트 포인터를 사용하여 원본 (정적으로 알려진) 개체 유형을 기억하고 삭제를 적용하는 것입니다.

더 일반적으로 명시적인 delete을 사용하지 마십시오. 스마트 포인터 및 컨테이너 개체로 남겨 두십시오.

1

기본 클래스를 파생 클래스로 캐스트하고 delete를 호출 할 수 있습니다.

관련 문제