2009-08-20 6 views
14

단순히 + 연산자를 오버로드하려고하고 있는데이 컴파일러 경고가 표시됩니다.C++ 컴파일러 경고 - 지역 변수 반환

reference to local variable 'tmp' returned 

다음은 오버로드 코드입니다.

const Int& Int::operator+(const Int& p) const 
{ 
    Int tmp = value + p.value; 
    return tmp; 
} 

다음은 클래스

class Int{ 
    int value; 
public: 
    Int() {} // default constructor 
    Int(int v) : value(v) {} 
    Int& operator=(const Int&); 
    const Int& operator+(const Int&) const; 
}; 
입니다.

답변

15

로컬 변수에 대한 참조를 반환 할 수 없습니다. operator+() 함수 안에는 tmp이라는 로컬 변수가 생성됩니다. 함수가 종료되자 마자 파괴됩니다. 호출 함수가 리턴 값을 가져올 때 더 이상 존재하지 않기 때문에 해당 변수에 대한 참조를 리턴 할 수 없습니다. 경고없이

const Int operator+(const Int&) const; 

그것은 만들 것이다 너무 잘 작동 :

는에 함수의 당신의 정의를 변경

.

7

당신이하려고하는 것은 반환 할 순간에 유효하지 않은 메모리 위치에 대한 참조를 반환하는 것입니다.

변수 tmp가 범위를 벗어날 때 (즉, 연산자 +가 끝날 때) 사라집니다.

반환 유형이 Int &이므로 "return tmp"에는 tmp 값이 반환되지 않고 tmp에 대한 참조가 반환됩니다. 메소드가 끝난 후에도 tmp가 더 이상 존재하지 않기 때문에 이것은 올바르지 않습니다 !!

해결 방법 : 참조로 반환하지 말고 지능

0

tmpauto의 저장 클래스를 가지고 있으며, 우리가 종료하면 사라집니다. 대답은 정적을 지정하는 것입니다.

static Int tmp = value + p.value; 

tmp에 할당 된 저장

은 프로그램의 기간 동안 예약 된 상태로 유지됩니다.