2012-07-26 2 views
0
#include<iostream> 
#include<conio.h> 

using namespace std; 

/* test class: created the reference of 
    abc class locally in function getRef() 
    and returned the reference.*/ 

class abc { 
    int var; 

    public: 
     abc():var(5) {} 
     abc(int v):var(v) {} 
     abc & getRef() { 
      abc myref(9); 
      return myref; 
     } 
     void disp() { 
      cout<<var<<endl; 
     }  
}; 

int main() { 
    abc a; 
    abc b=a.getRef(); 
    b.disp(); /* this statement executed perfectly. 
       I think compiler should throw error here. */ 
    getch(); 
    return 0; 
} 

컴파일러에서 컴파일 오류를 발생시켜야합니다. 설명 해주십시오 ?함수에서 로컬 변수를 참조하는 중 오류가 발생하지 않습니다.

+1

중복 가능성 http://stackoverflow.com/questions/6441218/can-a- local-variables-accessible-outside-its-scope) –

답변

1

컴파일러는 오류가 아닌 곳에서 오류로 b.disp();을 플래그 지정해서는 안됩니다. 오류는 return myref;에 있으며 그다지 어려운 오류가 아닌 이유는 일반적으로 return 이후에 개체의 수명이 끝났는지 여부를 확인하는 것이 매우 어렵다는 것입니다. 이 경우 쉽고, 일부 컴파일러는 그것에 대해 경고하려고합니다. 경고 수준을 확인하십시오.

편집 : 경고 : 기본적으로 gcc가 사용되며 경고는 '경고 : 로컬 변수'... '에 대한 참조가 반환되었습니다'와 같습니다.

+0

myref가 반환되는 동안 오류가 발생하면. 그렇다면 왜 터미널에서 출력이 9로 나오습니까? 출력물에 나에게 불쾌감을주는 값이 있어야합니다. –

+0

@ShashankJain "쓰레기"가 9가되지 않는다고 생각하게하는 이유는 무엇입니까? 이 동작은 C++ 표준에 의해 정의되지 않았으므로 "올바른"동작을 포함하여 런타임의 * 모든 동작이 유효 함을 의미합니다. (실제로 "쓰레기"는 이전에 쓰던 동일한 메모리 위치에서로드되고 우연히 아직 덮어 쓰지 않은 상태로 발생합니다.) – hvd

0

G ++는 적절하게 이것에 대해 경고하지만, 실제로 그 줄에 반환 값을 사용하지 않는 때문에, 그렇지 b.disp();에 확실히 오류와 안 당신은 위의 라인을을 복사.

컴파일러에서 경고하지 않으면 check your warning level입니다. 또한

:

#include<conio.h> 

This does not make for portable code.

[? 로컬 변수의 메모리가 그 범위 밖에 액세스 할 수]의 (
+0

하지만이 질문이 잘못된 경우 컴파일러도 경고를 throw합니다. (내 시각적 인 stuido 2008이며 모든 경고를 던지지 않는), 그럼 왜 내가 출력을 얻는 9 않습니다. 터미널 B 위에 변수 저장소를 사용하여 터미널 위에 표시되도록합니다. –

+0

@ShashankJain : "/ w,/Wn,/WX,/Wall,/wln,/wdn,/wen,/won (Warning Level)"링크를 포함하도록 답변을 업데이트했습니다. – Johnsyweb

관련 문제