2016-07-02 4 views
0

Visual Studio 2010 컴파일러를 사용하고 있으며이 프로그램의 출력을 이해하려고합니다.C++ 함수는 파괴 후 유효한 '참조 용'객체를 반환합니다.

코드 :

#include <iostream> 
using namespace std; 

class A 
{ 
public: 
    int i; 
    A() 
    { 
     i=0; cout<<"constructing A..\n"; 
    } 
    A(int a): i(a) 
    { 
     cout<<"constructing A with argument\n"; 
    } 
    A(A& a) 
    { 
     i=a.i; 
     cout<<"copy constructor\n"; 
    } 
    ~A() 
    { 
     cout<<"destructing a: " << i << endl; 
    } 
}; 

A& f(A b) 
{ 
    return A(25); 
} 

void main() 
{ 
    A m; 
    cout << "i = " << f(m).i << endl; 
} 

출력 :
구성하는 ..
복사 생성자
인수
는 파괴한다와 구축 : 25
는 파괴한다 : 0
를 내가 = 25
destructing a : 0

내 이해에서 A (25)는 참조에 의해 반환 된 다음 파손되었으므로 왜 i : 'i = 25'값을 인쇄합니까?

+3

얼굴에 정의되지 않은 동작입니다. 정의되지 않은 동작의 동작에 대해 묻는 것은 꽤 쓸모가 없습니다. –

+2

종이에 무언가를 써서 쓰레기통에 던지면 몇 분 후에 한 번 보시면 메모가 그대로 남아 있습니다. 왜? 그 동안 아무도 당신 쓰레기통을 비우지 않았기 때문입니다. 그 종이에 아무 것도 중요하지 않은 것이 더 좋을 것입니다. 왜냐하면 당신이 나중에 보게되면 그 위에있을 수 있기 때문입니다. 누군가 다른 것으로 대체 할 수있었습니다. 정의되지 않은 동작을 이해하려고하면 시간이 낭비됩니다. – user463035818

답변

0

프로그램에 정의되지 않은 동작이 있습니다. 그럼에도 불구하고 출력은 비 살아있는 객체가 차지하고있는 메모리가 아직 덮어 쓸 수 없기 때문에 예상대로 될 수 있습니다.