소멸자를 호출하지 않고 코드 간 goto 점프를 할 수 있나요?
질문: goto 점프가 코드를 우회할 수 있다는 것이 사실인가요? 실행되지 않는 섹션 소멸자?
예: 다음 코드를 고려하세요.
void f() { int x = 0; goto lol; } int main() { f(); lol: return 0; }
goto 점프 후에 객체 x가 삭제됩니까?
답변:
아니요, 개체입니다. x는 유출되지 않습니다.
이러한 믿음은 흔한 오해입니다. goto 점프는 C의 범위 지정 메커니즘을 우회하지 않으며 소멸자는 예상대로 호출됩니다.
1. 레이블 범위:
Goto 문은 함수 경계를 뛰어넘을 수 없습니다. 라벨의 범위는 라벨이 정의된 기능으로 제한됩니다.
2. 개체 초기화:
Goto 점프는 개체 초기화를 우회할 수 없습니다. 초기화되지 않은 개체를 건너뛰려고 하면 컴파일러 오류가 발생합니다. 마찬가지로 초기화된 객체를 건너뛰면 이전 인스턴스가 삭제됩니다.
3. 객체 범위:
자동 저장 기간이 있는 객체는 goto 점프가 해당 범위를 벗어날 때 누출되지 않습니다. C는 범위를 종료할 때 객체 구성의 역순으로 객체가 삭제되도록 보장합니다.
결론:
Goto 점프는 C의 범위 및 삭제 규칙을 완전히 존중합니다. goto를 사용하여 이러한 메커니즘을 우회하고 메모리 누수를 발생시키는 것은 불가능합니다. 하지만 여전히 goto를 과도하게 사용하는 것은 코드를 이해하고 유지 관리하기 어렵게 만들 수 있으므로 권장하지 않습니다.
위 내용은 `goto`는 C에서 소멸자 호출을 건너뛰나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!