2010-02-03 2 views
12

는 I는 다음 snipplet 있다고 가정합시다 : 이제C++ 소멸자 및 함수 호출 순서

Foo foo; 
.... 
return bar(); 

, C++ 표준은 나에게 그 줄을 보장하지 않습니다()는 foo는 :: ~ 푸 전에()를 호출 할 것인가? 아니면 컴파일러/구현의 선택입니까?

감사합니다.

+0

C++ 교과서에서 주제에 대해 무엇을 말해야합니까? –

+2

당신이 말하는이 책은 무엇입니까? 그것은 스택 오버 플로우와 같습니까?하지만 편집하고 종이에 올릴 수 있습니까? – anon

답변

15

동작이 보장됩니다.

  • 어떤 프로그램 실행을 보장, 일반적으로

1.9 프로그램 실행

: 여기

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() 

는 표준에서 일부 참조입니다 다음과 같이 실제 실행은 풀린다 10 자동 저장 기간 (3.7.2)을 갖는 각 객체의 인스턴스는입니다.은 각 항목과 연관된 블록에 있습니다.

  • foo 자동 저장 기간이며 :

3.7.2 자동 저장 기간

1 지역 객체가 명시 적으로 자동차를 선언하거나 등록 또는 명시 적으로 정적 를 선언하지 않거나 extern에 자동 저장 기간이 있습니다. 에 대한 저장소 이러한 개체는 생성 된 블록이 종료 될 때까지 지속됩니다.

  • return 문의 실제 효과는 무엇입니까

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++ 표준에 흩어져있는 단일 아이디어 양식 정보를 쉽게 파악할 수 있습니다. 다행히도 빠른 개요는 그러한 분석을 직접하는 데 도움이됩니다.

7

예, bar()는 foo의 소멸자보다 먼저 호출됩니다.

이 표준은 말한다 : 6.6 : 자동 저장 기간 (3.7.2) (명명 된 객체 또는 임시직) 모든 구성 개체에 대한 이른바 "(그러나 수행) 범위에서에 출구, 소멸자 (12.4)입니다 그 해당 범위 내에서 선언의 역순으로 으로 선언됩니다. "

return 문이 완료 될 때까지 범위가 남아 있지 않습니다.

5

Foo를 포함하는 스택 프레임을 정리하기 전에 bar() 호출 결과를 평가해야하므로 Foo :: ~ Foo()보다 먼저 bar()가 호출됩니다.

3

범위를 벗어날 때 개체가 파괴됩니다.

return은 범위를 벗어나지 만 bar()을 실행해야 반환 할 수 있습니다. Ergo, bar()이 호출되었습니다.

2

그냥 return bar(foo); 인 경우 어떻게 생각하세요? 그냥 은 작동하려면을가집니다. 인수를 전달할지 여부에 따라 파기 순서가 다른 경우 바보입니다.