> 백엔드 개발 > C++ > NULL 포인터에서 가상이 아닌 메서드를 호출해도 정의되지 않은 동작이 발생하지 않는 이유는 무엇입니까?

NULL 포인터에서 가상이 아닌 메서드를 호출해도 정의되지 않은 동작이 발생하지 않는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-12-31 18:44:13
원래의
266명이 탐색했습니다.

Why Does Calling a Non-Virtual Method on a NULL Pointer Not Result in Undefined Behavior?

NULL 포인터에서 클래스 멤버에 액세스

Foo 유형의 인스턴스에 대한 포인터로 선언되었음에도 불구하고 foo 변수는 다음으로 초기화됩니다. 0, 널 포인터로 만듭니다. 널 포인터의 멤버에 액세스하는 것은 일반적으로 정의되지 않은 동작이므로 이는 직관에 어긋나는 것처럼 보일 수 있습니다. 그러나 특정 상황에서는 이러한 동작이 허용됩니다.

비가상 메소드 호출

가상 메소드가 아닌 say_hi()는 널 포인터에도 불구하고 성공적으로 호출됩니다. 가상 방법. 가상 메서드에는 개체 유형에 따라 호출할 함수를 결정하기 위해 유효한 개체가 필요합니다. 반면 비가상 메서드에는 컴파일러가 직접 함수 호출 명령을 생성하는 데 사용하는 미리 결정된 함수 주소가 있습니다.

구체적으로 컴파일러는 다음과 동일한 코드를 생성합니다.

void Foo_say_hi(Foo* this);
Foo_say_hi(foo);
로그인 후 복사

say_hi() 함수는 this 포인터를 참조하지 않으므로 잠재적인 null을 역참조할 필요가 없습니다. 포인터.

객체 할당

foo 변수는 메인 함수 내의 지역 변수이므로 함수의 스택에 할당됩니다. 포인터 변수로서 그것이 가리키는 실제 객체는 여기에 할당되지 않습니다. null 값은 포인터가 유효한 개체를 참조하지 않음을 나타냅니다.

위 내용은 NULL 포인터에서 가상이 아닌 메서드를 호출해도 정의되지 않은 동작이 발생하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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