2011-01-10 5 views
0

됩니다 내 문제입니다.파생 소멸자는 여기에 문제

문제는 기본 소멸자에서 그 포인터를 기반의 개인 항목으로 등록 취소해야한다는 것입니다. 그래서 어떻게됩니까, 기본 소멸자에서 클래스 포인터를 호출하려고하고 파생 된 파생 된 그것을 유지하는 것입니다, 그것은 이미 해제되었습니다. 그래서 문제가 생깁니다. 내가 뭘 할 수 있니?

감사합니다.

답변

0

기본 클래스 포인터에 대한 인스턴스를 생성하면 할 수없는 이유는 그것이 무료 그것뿐만 아니라? 자유를 기본 소멸자로 옮기는 것을 방해하는 것이 있습니까?

특정 수준의 계층에서 누가 동일한 수준의 계층 구조를 통해 동일한 책임을 분담하는지는 누가 항상 이러한 문제를 일으키는 지 항상 일관되게하는 것이 가장 좋습니다. 물론베이스에서 상속받은 다른 클래스를 만들려면 새 클래스에서도이 관리를 다시 구현해야하며 코드 중복을 만들어야합니다.

0

상속의 생성자와 소멸자의 순서는 반대입니다. 기본 생성자는 파생 된 생성자보다 먼저 호출됩니다. 삭제시 역 분개가 발생합니다. 먼저 파생 클래스가 삭제됩니다.

문제를 해결하려면 기본 소멸자가 개인 인스턴스가 NULL이 아닌지 테스트 할 수 있습니까?

+0

그래, 나는 그 지적한 객체의 기능을 여전히 호출해야한다는 것을 제외하고는 그것을 할 수있다. 그렇지 않으면 문제를 일으킨다. – jmasterx

0

설명에서 나는 파생 클래스가이 포인터를 담당 할 때가 있고 때로는 기본 클래스가 될 것이라고 생각합니다. 가장 간단한 해결책은 기본 클래스에 부울을 추가하여 개체 소유권자를 추적 할 수있게하는 것입니다. 기본 클래스가 포인터를 초기화 한 경우 부울을 true로 설정합니다. 그런 다음 소멸자가 객체를 소유 한 사람과 그것이 정리되어야하는지 여부를 확인할 수 있습니다.

더 나은 해결책은 boost : shared_ptr을 사용하는 것입니다. 마지막 참조가 범위를 벗어나면 자동으로 개체를 정리하는 참조 계산 포인터 추상화입니다. 이 추상화를 사용하면 일반적으로 포인터를 놓는 사람에 대해 걱정할 필요가 없습니다.

0

기본 클래스는 정리를 수행하기 위해 protected 멤버 함수를 구현할 수 있으며 파생 된 소멸자는 리소스를 삭제하기 전에이 도우미 함수를 호출 할 수 있습니다.

0

생성자가 메모리를 할당하는 경우 해당 소멸자가 메모리를 확보해야합니다. 조건부로 메모리를 할당하면 조건부로 메모리를 해제해야합니다. 부울 플래그는 할당이 발생했는지 여부를 결정하는 데 도움이됩니다.

다른 해결책은 참조 카운팅을 사용하는 것입니다. 할당시, 참조 카운트는 1이되어야한다. 다른 클래스가 객체에 관심이 있다면, 참조 카운트를 증가시킴으로써 포인터를 유지한다. 클래스가 더 이상 객체에 관심이 없으면 참조 횟수가 줄어 듭니다. 카운터가 0에 도달하면 개체를 삭제해야합니다. shared_ptr은 표준 C++ 레퍼런스 카운트 된 자동 포인터 구현이며 복잡한 혼합 소유권 상황에서 매우 잘 작동합니다.