출력

2010-04-21 2 views
3
, 나는 이런 식으로 뭔가를 얻을

:출력

;; Function virtual Foo::~Foo() (null) 
;; enabled by -tree-original 

{ 
    <<cleanup_point <<< Unknown tree: expr_stmt 
    (void) (((struct Foo *) this)->_vptr.Foo = &_ZTV3Foo + 8) >>> 
>>; 
} 
<D.20148>:; 
if ((bool) (__in_chrg & 1)) 
    { 
    <<cleanup_point <<< Unknown tree: expr_stmt 
    operator delete ((void *) this) >>> 
>>; 
    } 

내 질문은 : "<D.20148>:;"이 표시된 후 코드는 어디에 있습니까? 소멸자의 외부에 있으므로이 코드는 언제 실행됩니까?

답변

3

소멸자가 호출 된 후 실제 메모리 할당을 관리하는 컴파일러 생성 코드와 유사하며 소멸자 코드 바로 다음에 실행해야합니다.

+0

어셈블리 출력을보고 나면 네가 옳은 것처럼 보입니다. 그러나 코드가 소멸자의 외부에 표시되는 이유와 레이블의 의미를 알 수 있습니까? – Job

+0

컴파일러는 작성한 코드에 따라 생성 된 내용을 표시합니다. 해당 레이블 다음의 코드는 자동 생성되며 소멸자가 아니라 삭제 호출에 의해 실제로 유도됩니다. 소멸자 바로 다음에 호출되었지만 소멸자 코드의 일부가 아닙니다. 나는 라벨이 무엇을 의미하는지 전혀 모른다. –