2012-06-15 4 views
0

다음 코드는 안전한가요? 범위를 벗어난 참조가 아무 것도 가리 키지 않습니까?

class B { 
    public: 
    int& b; 
    B (int& _b) : 
     b(_b) {} 
}; 

B* foo() { 
    int a; 
    return new B(a); 
} 

는 아무것도 foo는 점에 의해 반환 된 객체의 참조는 컴파일 그림이을 (INT A를하기 때문에 범위를 벗어난 것입니다) 또는 수행 할 것인가?

+6

'B :: b'는'foo()'가 반환 할 때 더 이상 존재하지 않는 지역 변수 인'a'가 이미 존재하는 것처럼 매달려 있습니다. – hmjd

+0

17.6.4.3.2/2를 참조하십시오. * 밑줄로 시작하는 각 이름은 전역 이름 공간에서 이름으로 사용하기위한 구현에 예약되어 있습니다. *. 대신에'b_'를 사용하십시오. – dirkgently

+1

@dirkgently, 해당 이름은 전역 네임 스페이스에 없으며 이름은 ok –

답변

5

컴파일러에서 경고 할 수 있지만 a 개체가 foo 범위의 끝에 존재하지 않으므로 새로 만든 개체에 포함 된 잘못된 참조가 포함되어 있습니다.

관련 문제