NULL 포인터에서 클래스 멤버 액세스: 비가상 메소드 동작 탐색
질문:
가상 메서드 호출이 NULL 포인터에서 성공하는 이유는 무엇입니까? C에서 가상 메소드 호출이 프로그램을 충돌시키는 동안?
답변:
비가상 메소드 동작:
가상이 아닌 메서드가 NULL 포인터에서 호출되면 컴파일러는 메서드의 메서드를 직접 호출하는 코드를 생성합니다. 구현. 이는 숨겨진 "this" 매개변수를 함수에 전달함으로써 달성됩니다. 이 매개변수는 NULL 포인터의 경우 아무 것도 가리키지 않습니다. 그러나 메서드 자체는 개체의 어떤 멤버에도 액세스하려고 시도하지 않으므로 코드는 NULL 포인터 역참조를 방지하고 의도한 대로 작동합니다.
정식 정의:
그러나 NULL 포인터에서 메서드를 호출하는 것은 공식적으로 C에서 정의되지 않은 동작으로 간주된다는 점에 유의하는 것이 중요합니다. 이는 프로그램이 명백히 올바르게 실행되도록 허용하는 것을 포함하여 컴파일러가 발생하는 상황에 대해 임의의 선택을 할 수 있음을 의미합니다.
가상 메서드 동작:
가상 메서드 호출에는 vtable이 필요합니다. 호출할 구현을 결정하기 위해 조회합니다. vtable은 실제 객체와 연관되어 있으므로 연관된 vtable이 없는 NULL 포인터에서 가상 메서드를 호출하면 충돌이 발생합니다.
객체 할당:
제공된 코드의 변수 "foo"는 메인 함수의 스택에 할당된 로컬 변수입니다. 그러나 NULL 포인터로 초기화되어 Foo 유형의 유효한 객체를 가리키지 않음을 나타냅니다.
위 내용은 C에서 가상 메서드 호출이 실패하는 반면 NULL 포인터에 대한 비가상 메서드 호출은 성공하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!