2012-07-06 7 views
2

누구든지이 코드가 왜 작동하는지 설명 할 수 있습니까 (왜 값을 반환합니까)? 당신은 정의되지 않은 동작를 호출하고이상한 값을 반환하는 포인터의 참조

-572662307 
+4

무엇을 기대 했습니까? – RedX

+0

정확하게이 질문을 한 것은 무엇입니까? 사람들이 그러한 질문을 할 때, 그들은 그들이 기대했던 것과 다른 것을 보았다는 것을 의미합니다. 이 경우에 무엇을 기대 했습니까? – AnT

+0

나는 아무것도 보지 못했다. 나는 이런 식으로 시도했을 때 일어날 일에 대해이 아이디어를 얻었다. 그래서 시도해 보았고 이상한 결과를 얻었 기 때문에 다음과 같이 질문했다. D – deadmau5

답변

3

무슨 일을하면 정의되지 않은 동작이 발생하므로이 숫자를 얻는 것은 완벽하게 합당한 동작입니다.

이 시퀀스를 수행 할 때 : rPtr는 이제 선 new int(113)로 만든 정수를 의미

int *ptr = new int(113); 
int &rPtr = *ptr; 

참조하십시오. 다음 줄에, 당신은 실행

delete ptr; 

int는 개체가 더 이상 존재 의미가없는 것을 삭제합니다. 포인터 또는 참조가 할당되지 않은 객체를 참조하므로 정의되지 않은 동작이 발생합니다. 따라서, 때 발생할 수 있습니다

cout << rPtr << endl; 

아무것도와 rPtr을 인쇄 할 수 있습니다. 여기에서는 가비지 데이터 만 가져오고 있지만 프로그램이 쉽게 손상되거나 디버그 오류 메시지가 표시 될 수 있습니다.

흥미롭게도 : 인쇄 된 값 (-572662307)은 32 비트 부호없는 값으로 처리되며 0xDDDDDDDD입니다. 나는 이것이 메모리 할당 자 (memory allocator)가 할당 취소 된 메모리에 값을 넣어 내기 때문에이 같은 메모리 오류를 디버그하는 데 도움이 될 것입니다.

희망이 도움이됩니다.

+0

답장을 보내 주셔서 감사합니다 :) – deadmau5

0

:

int main() 
{ 
    int *ptr = new int(113); 
    int &rPtr = *ptr; 

    delete ptr; 

    cout << rPtr << endl; 

    return 0; 
} 

기본적으로, 이것은 내가 얻을 반환 값입니다. 개체에 대한

int *ptr = new int(113); 
int &rPtr = *ptr; 
//rPtr references the memory ptr points to 
delete ptr; 
//the memory is released 
//the reference is no longer valid 
cout << rPtr << endl; 
//you try to access an invalid reference 
//anything can happen at this point 
0

참조 모든 블록 범위 살아있다 (이 경우 기능의 범위), 그래서 당신은 포인터를 삭제하면, 일부 쓰레기는이 주소 및 출력 쇼에서였다 참조는 더 이상 유효 포인터를 삭제 후 없습니다 그것.

관련 문제