2013-09-25 5 views
0
class Foo{ 
    private: 
     int i; 
    public: 
     Foo(int a) 
     { 
      i = a; 
     } 

     int getI() {return i;} 
}; 

int main() 
{ 
    Foo* f; 
    if(true) 
    { 
     Foo g(1); 
     f = &g; 
    } 

    cout << f->getI() << endl; 
    return 0; 
} 

위의 코드에서 Foo 클래스의 g 오브젝트는 if 절을 종료하면 범위를 벗어납니다. 그래서 cout 문이 실행될 때 1을 인쇄 할 것인가?오브젝트 포인터가 C++에서 오브젝트 범위 외부를 가리키는 이유

+3

당신의 코에서 날아 다니는 악마 - 또는 정의되지 않은 행동. –

답변

1

객체가 파괴 될 것입니다 ... 당신은 어쩌면 때때로 정확한 값을 출력합니다 ... cout을 인쇄 무슨

을 알 수 있지만, 데모의 날이 정확하지 않을 것이라는 점을 확신 할 수 있습니다 , 개체의 소멸자를 호출합니다.

포인터가 여전히 같은 메모리 위치를 가리 킵니다.

액세스하는 것은 정의되지 않은 동작이므로 전혀 수행 할 수 없습니다.


이의 행동을지지 않습니다,하지만 코드는이 코드가 포함되어있는 경우 다음 메모리가 덮어 씌우되지 않았을 것으로 효과적으로 일을 인쇄 할 수있는 좋은 기회가 될 수 있습니다.

그러나이 경우에 해당되지는 않습니다.

4

동작은 정의되지 않습니다. 그것은 무엇이든을 전혀 할 수 있었다. 정의되지 않은 동작은 절대 피하십시오.

0

수 있습니다. 그렇지 않을 수도 있습니다. 개체가 파괴되고 포인터가 메모리의 동일한 주소를 가리 킵니다.

하지만이 포인터의 역 참조는 undefined behavior이며 원하는 것은 아닙니다. 실제로, 아무도 그것이 무엇을 할 것이라고 말할 수있는 프로그램의 사용은 무엇입니까?

3

은 정의되지 않은 동작입니다.. 합법적으로 그것은 1을 인쇄 할 수 있고, 42를 인쇄 할 수 있으며, 피자를 주문하거나 우주의 모든 삶을 끝낼 수있는 모든 것을 할 수 있습니다. 모두 합법적 인 결과입니다. 정의되지 않은 동작은 입니다. 매우입니다.

g이 범위를 벗어나면 더 이상 정의되지 않으며 f은 정의되지 않은 개체를 가리키고 참조 해제 f은 금지되어 있지 않지만 정의 된 방식으로 지원되지 않습니다.