> 백엔드 개발 > C++ > C에서 순수 가상 소멸자를 구현해야 합니까?

C에서 순수 가상 소멸자를 구현해야 합니까?

Susan Sarandon
풀어 주다: 2024-12-23 15:56:11
원래의
331명이 탐색했습니다.

Should a Pure Virtual Destructor in C   Be Implemented?

C의 순수 가상 소멸자: 주의 사항

C에서 추상 기본 클래스를 정의할 때 다음과 같이 가상 소멸자를 순수 가상으로 선언하고 싶은 유혹이 있을 수 있습니다. 아래 코드 조각에 나와 있습니다.

class A {
public:
    virtual ~A() = 0;
};
로그인 후 복사

이 구문은 특정 경우에 유효하지만 MSVC와 같은 컴파일러에는 런타임 충돌을 일으킬 수 있는 숨어 있는 위험이 있습니다.

문제: 소멸자 구현 누락

위 코드의 문제는 가상 소멸자가 다음으로 선언된다는 것입니다. 구현을 제공하지 않고 순수해야 합니다. 이는 소멸자의 동작이 구체적인 파생 클래스에 위임됨을 의미합니다. 그러나 A 유형의 객체 자체가 소멸되면 해당 소멸자가 호출되며, 구현이 부족하면 정의되지 않은 동작이 발생하게 됩니다.

잠재적 결과

일반적인 시나리오에서는 추상 기본 클래스 A에서 파생 클래스의 개체를 삭제하려고 시도하면 궁극적으로 A의 소멸자가 호출됩니다. 구현하지 않으면 특정 플랫폼에서 purecall 핸들러 호출 및 프로그램 충돌과 같은 정의되지 않은 동작이 발생할 수 있습니다.

해결책: 소멸자 구현

이 문제를 해결하려면 추상 기반 클래스의 소멸자는 본문이 비어 있더라도 명시적으로 구현되어야 합니다. 아래의 수정된 코드 조각은 이를 보여줍니다.

class A {
public:
    virtual ~A() = 0;
};

inline A::~A() { }
로그인 후 복사

A의 소멸자에 대한 빈 구현을 제공함으로써 직접 호출되거나 파생 클래스를 통해 호출될 때 해당 동작이 정의되도록 할 수 있습니다.

위 내용은 C에서 순수 가상 소멸자를 구현해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿