는 I는 다음 snipplet 있다고 가정합시다 : 이제C++ 소멸자 및 함수 호출 순서
Foo foo;
....
return bar();
, C++ 표준은 나에게 그 줄을 보장하지 않습니다()는 foo는 :: ~ 푸 전에()를 호출 할 것인가? 아니면 컴파일러/구현의 선택입니까?
감사합니다.
는 I는 다음 snipplet 있다고 가정합시다 : 이제C++ 소멸자 및 함수 호출 순서
Foo foo;
....
return bar();
, C++ 표준은 나에게 그 줄을 보장하지 않습니다()는 foo는 :: ~ 푸 전에()를 호출 할 것인가? 아니면 컴파일러/구현의 선택입니까?
감사합니다.
동작이 보장됩니다.
1.9 프로그램 실행
: 여기
는 표준에서 일부 참조입니다 다음과 같이 실제 실행은 풀린다 10 자동 저장 기간 (3.7.2)을 갖는 각 객체의 인스턴스는입니다.은 각 항목과 연관된 블록에 있습니다.0: enter block (scope) 1: Foo::Foo() 2. evaluation of bar(); as expression in return statement 3. save result of the expression as value returned from function 4. finalize return statement to leave function to its caller (request exit from current scope) 5: exit block (scope) with call to Foo::~Foo()
foo
자동 저장 기간이며 :3.7.2 자동 저장 기간
1 지역 객체가 명시 적으로 자동차를 선언하거나 등록 또는 명시 적으로 정적 를 선언하지 않거나 extern에 자동 저장 기간이 있습니다. 에 대한 저장소 이러한 개체는 생성 된 블록이 종료 될 때까지 지속됩니다.
6.6.3
2 (...) 식의 값이 호출자에게 반환
return 문 함수
및
012 자동 저장 기간 모든 구성 개체에 대한라고 3,516,6.6 점프 문 (귀국일가 문을 뛰어 속함)
2 범위에서 출구에서 (그러나 달성), 소멸자 (12.4) (3.7.2)
6.7 선언 이 블록에 선언 자동 저장 기간이 2 개 변수 이
및
12.4 소멸자에게 블록에서 종료에 파괴
10 소멸자가 호출된다
문 정적 저장 기간이 인 객체의 경우 암묵적으로 (1) (3.7.1) at 프로그램 종료 (3.6.3), (2) 블록에있는 물체가 이탈 (6.7)
를 생성 자동 저장 기간 (3.7.2)와 구성 객체 것은 아니다 모든 C++ 표준에 흩어져있는 단일 아이디어 양식 정보를 쉽게 파악할 수 있습니다. 다행히도 빠른 개요는 그러한 분석을 직접하는 데 도움이됩니다.
예, bar()는 foo의 소멸자보다 먼저 호출됩니다.
이 표준은 말한다 : 6.6 : 자동 저장 기간 (3.7.2) (명명 된 객체 또는 임시직) 모든 구성 개체에 대한 이른바 "(그러나 수행) 범위에서에 출구, 소멸자 (12.4)입니다 그 해당 범위 내에서 선언의 역순으로 으로 선언됩니다. "
return 문이 완료 될 때까지 범위가 남아 있지 않습니다.
Foo를 포함하는 스택 프레임을 정리하기 전에 bar() 호출 결과를 평가해야하므로 Foo :: ~ Foo()보다 먼저 bar()가 호출됩니다.
범위를 벗어날 때 개체가 파괴됩니다.
return
은 범위를 벗어나지 만 bar()
을 실행해야 반환 할 수 있습니다. Ergo, bar()
이 호출되었습니다.
그냥 return bar(foo);
인 경우 어떻게 생각하세요? 그냥 은 작동하려면을가집니다. 인수를 전달할지 여부에 따라 파기 순서가 다른 경우 바보입니다.
C++ 교과서에서 주제에 대해 무엇을 말해야합니까? –
당신이 말하는이 책은 무엇입니까? 그것은 스택 오버 플로우와 같습니까?하지만 편집하고 종이에 올릴 수 있습니까? – anon