2013-07-12 3 views
4

소멸자에 대해 이해할 수있는 문제가 있습니다.C++ - 잘못된 소멸자가 호출됩니다.

#include <iostream> 

using namespace std; 

class X{ 
public: 
    int id; 
    X(int id){ 
     this->id = id; 
    } 
    ~X(){ 
     cout << "destroying " << id; 
    } 

}; 



int main(){ 


    X a(1); 
    a = X(2); 


    while(true); 
    return 0; 

} 

나는 다음과 같은 출력 얻을 : 다음 예에서

내가 소멸자는 항상 호출되는 것을 생각했기 때문에,

이 나에게 전혀 예기치 못한 파괴를 할 때 객체를 멈추다.

그러나이 예제에서는 오브젝트 1이 존재하고 오브젝트 2로 대체됩니다. 오브젝트 1의 소멸자를 호출하는 대신 오브젝트 2의 소멸자가 호출됩니다.

누군가 설명 할 수 있습니까?

+0

메인 반환 후에 만 ​​멈추는 것은 멈추지 않고, 당신은 op = – PlasmaHH

답변

2

a = X (2); => 표현 호출 할당 연산자 및 a.id 데이터 멤버는 temporaryobject.id 즉, 2로 초기화됩니다.

a = X (2); => expression은 컴파일러가 제공하는 기본 할당 연산자를 호출하고 sallow 복사본을 수행합니다. 임시 개체가 개체에 대한 또 다른 전화를받을 때 전화를받을 (2) 발현

X는 임시 객체를 생성하고 temporaryobject.id 2.

처음의 해체로 초기화됩니다.

5

귀하의 경우 하나의 개체 만 파괴됩니다. 즉, 과제의 오른쪽에있는 임시 X(2)입니다. 원래 X(1)은 할당에 의해 덮어 쓰기 때문에 파괴되지 않습니다. 파괴 될 시간이 올 때 destroying 2도 인쇄됩니다.

그러나 수정 된 X(2)은 (X(1)로 시작했다가) 무한 루프에 의해 살아 유지, 그래서 하나 파괴되지 않습니다. 무한 루프를 제거하면이 문제가 해결됩니다 (demo).

+0

을 사용해서 만 할당합니다. 이것은 아주 좋은 답변이지만 @ PlasmaHH의 코멘트를 읽은 후에도 이해할 수있었습니다. 할당 연산자에 대해 언급합니다. 나는 당신이 당신의 대답에도 이것을 언급해야한다고 생각합니다.) 왜냐하면 그것은 먼저 (1)이 파괴되어야한다고 생각하고 그 기억의 공간이 (2)의 새로운 사본으로 채워 져야한다고 생각했습니다. 하지만 그 대신에 (1)이 (2) –

+0

@VanCoding에 맞게 수정됩니다. 나는 그것이 "연산자"라는 것을 알고 있다고 가정하고 "할당"을 두 번 말합니다 : – dasblinkenlight

+0

하지만 할당은 다르게 해석 될 수 있습니다. 보시다시피 : DI는 메모리가 할당되면서 (1)을 (2)로 변환하는 함수가 호출되지 않는다고 생각했습니다. –

관련 문제