2013-02-16 4 views
1

는 I는 C++ 코드해제 된 메모리를 가리키는 참조가 왜 작동합니까?

#include <iostream> 
using namespace std; 

int main() 
{ 
    int *p = new int; 
    *p = 10; 
    int &a = *p; 
    delete p; 
    a = 20; 
    cout<<a<<" "; 
    cout<<*p; 
    return 0; 
} 

이하 시도로서 출력을 얻었다 :이 해제 된 메모리 또는 어떤 쓰레기 액세스의 결과로서 런타임 에러를 일으킬 수 생각 20 20

. 아마 프로그램에서 메모리 위치가 해제되어서 지금까지 사용되지 않았을 수 있으므로 오래된 값을 유지하면서이 출력을 얻었을 것입니다.

그래서 나는 참조

#include <iostream> 
using namespace std; 

int main() 
{ 
    int *p = new int; 
    *p = 10; 
// int &a = *p; 
    delete p; 
// a = 20; 
// cout<<a; 
    cout<<*p; 
    return 0; 
} 

를 사용하지 않는 경우도 발생한다고 생각하지만, 0 (다중 실행으로 확인)이 경우에 나는 출력을 얻었다. Reference는 다른 산출물과 관련이 있습니까?

컴파일러 : GCC 버전 4.7.2 (우분투/리나의 4.7.2-2ubuntu1)

+5

이것은 정의되지 않은 동작입니다. – sgarizvi

+4

그것이 효과가있는 것처럼 보입니다. 넌 규칙을 어기고있어. –

+0

좋습니다. 첫 번째 출력 세트를 20으로 가져 오기위한 참조 연결이 없습니다. – user2078670

답변

0

정의되지 않은 동작이며, 다른 컴파일러 또는 그것을 깰 수있는 동일한 컴파일의 또 다른 버전으로 전환하는 등 일부 패턴을 알아내는 이유가 없다.

delete은 소멸자가 이 아닌 경우 유형을 호출합니다. 콘텐츠가 삭제 될 때 class Integer 래퍼를 사용하면 몇 가지 차이점이 나타납니다. 프리미티브 유형에서 delete은 해제 된 공간을 다시 초기화하지 않습니다. 따라서 원래 값이 으로 유지되는 것을 볼 수 있습니다. 그러나 이는 전혀 작동하지 않을 수 있으므로 절대 사용해서는 안됩니다.

2

당신은 출시 메모리를 역 참조한다. 이것은 정의되지 않은 동작입니다. 결과가 무엇인지 보증 할 수 없습니다. 컴파일러, 운영 체제 및 C++ 라이브러리를 함께 사용하면 프로그램이 제대로 작동하는 것 같습니다.

이것은 정의되지 않은 동작의 가능한 결과 중 하나입니다. delete -d 메모리를 역 참조

관련 문제