2011-05-13 2 views
16

내가 비주얼 스튜디오에서 다음 프로그램을 시도 2010 년C++ 소멸자의 행동

#include <iostream> 
using namespace std; 

class A { 
public: 
     int p; 

     /*A(){ 
      cout << "Constructor A" << endl; 
     }*/ 

     ~A(){ 
      cout << "Destructor in A" << endl; 
     } 
}; 

class D: public A 
{ 
public: 

     /*D(){ 
      cout << "Constructor D" << endl; 
     }*/ 

     ~D(){ 
      cout << "Destructor in D" << endl; 
     } 
}; 

int main() 
{ 
    D d = D(); 
    cout << "Exiting main" << endl; 
} 

내가 가진 출력했다 -

Destructor in D 
Destructor in A 
Exiting main 
Destructor in D 
Destructor in A 

내가 이해할 수없는 나는 왜 클래스 D의 소멸자와 A는 "Exiting main"명령문이 실행되기 전에 라고 불리고 있습니까?

나는 다른 일을 시도 - 그때 출력 I 예상되면서 위의 코드에서 클래스 D 생성자를 주석 처리 -

Constructor D 
Exiting main 
Destructor in D 
Destructor in A 

내가 여기에 놓친 거지 뭐?

답변

19

선 제

D d = D(); 

d 다음에 복사되는 임시없는 오브젝트를 생성한다. 명령문이 끝나면 임시 개체가 파괴됩니다. 명명 된 개체 dmain()이 완료된 후 범위를 벗어나면 소멸됩니다.

D에 복사 생성자를 추가하면 해당 생성자가 호출 된 것을 볼 수 있습니다.

생성자를 주석 처리 할 때 컴파일러에서 일부 최적화를 수행 할 수 있기 때문에 예상되는 동작을 보았다고 생각합니다.

+0

왜 두 번째 예제가 더 이상 소멸자 호출을 인쇄하지 않는지 설명하지 않습니다. – Xeo

+0

어떻게해야하는지 알려줄 수 있습니다 (: –

+0

) 컴파일러는 elution을 복사해도 호출이 여전히 인쇄되어야합니다. – Xeo