2010-07-11 4 views
2

에 대한 참조를 반환 내가 어떻게 참조 예를 들어 경고를받지 않고 이의를 반환해야합니다 :컴파일러 경고 로컬 객체

std::string& GetString() 
{ 
    std::string str = "Abcdefghijklmnopqrstuvwxyz"; 
    return str; 
} 

int main() 
{ 
    std::string str = GetString(); 
} 

이것은 컴파일시에 경고를 발생합니다.

+2

값을 반환하지 않습니다. – GManNickG

+0

은 항상 스택에있는 객체를위한 것입니까? – user13645

+1

일반적으로 함수 호출과 독립적으로 존재할 값을 함수가 반환해야하는 경우 참조를 반환합니다. – GManNickG

답변

14

예제에서 로컬 변수 str에 대한 참조를 반환합니다. GetString()이 반환 되 자마자 str이 파괴되고 참조가 유효하지 않습니다 (파괴 된 개체를 나타냄).

개체에 대한 참조를 반환하는 경우 함수가 반환 된 후에도 유효 할 개체 여야합니다 (예 : 로컬 변수 일 수 없음).

이 특별한 경우에는 str을 값으로 반환해야합니다. 참조를 반환하는 가장 일반적인 용도는 멤버 변수에 대한 참조를 반환하는 멤버 함수입니다.

0

기술적으로는 힙에 생성하고 참조 반환 할 수 있습니다 (편집 : 집에서 따라하지 마세요, 메모리 누수 예 (감사 제임스)) :

string& GetString() { 
    string * strPtr; 
    strPtr = new string("qweqweqwe"); 
    string &str2 = (*strPtr); 
    return str2; 
} 

int main() { 
    string str = GetString(); 
    return 0; 
} 

그러나 옆 교칙, 값에 의해 전달 (위에서 말했듯이) 여기서 더 나은 옵션입니다.

+0

당신의 예제는'new'에 의해 할당 된 문자열을 누설합니다. –

+0

개체를 다시 복사하지 않으려합니다. – user13645

+1

@user : 물건을 복사 할 때 아무 문제가 없습니다. 그것은 항상 끝났고, 항상 끝내야합니다. 성능에 대해 걱정하지 말고 훌륭한 코딩 방법에 대해 걱정하기 시작하십시오. 귀하의 질문과 같이 참조를 어떻게 든 반환 할 수 있다고해도 고려하십시오. 'std :: string str = GetString();'은 어떻게됩니까? 'str'은 그것이 참조인지 아닌지에 관계없이'GetString'에 의해 반환 된 값의 * copy *입니다. – GManNickG

관련 문제