> 백엔드 개발 > C++ > `goto`는 C에서 소멸자 호출을 건너뛰나요?

`goto`는 C에서 소멸자 호출을 건너뛰나요?

Barbara Streisand
풀어 주다: 2024-11-26 12:24:08
원래의
419명이 탐색했습니다.

Does `goto` Skip Destructor Calls in C  ?

소멸자를 호출하지 않고 코드 간 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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