2013-08-12 2 views
1

내 코드를 컴파일 할 때 경고 메시지가 나타납니다. 경고 : 로컬 변수 'str'에 대한 참조가 반환 됨 [기본적으로 사용 가능] 문제가 무엇인지, m 당신이를 반환하는연산자가 오버로드되는 C++의 MyString 클래스

+0

[로컬 또는 임시 변수의 주소를 반환]의 중복 가능성 (http://stackoverflow.com/questions/2744264/returning-the-address-of-local- 임시 변수 또는 임시 변수) – dyp

답변

3

.. 내가 왜 임 개체를 반환하는 것을 불평 모른다 ..이 경고를 받고 모두 임에

MyString& operator+(MyString &a){ 
    char *tmp=new char[strlen(szArr)+strlen(a.szArr)+1]; 
    strcpy(tmp, szArr); 
    strcat(tmp, a.szArr); 
    MyString str(tmp); 
    delete tmp; 
    return str; 
} 
MyString& operator+(char *s){ 
    if(s) 
     return *this; 
    char *tmp=new char[strlen(szArr)+strlen(s)+1]; 
    strcpy(tmp, szArr); 
    strcat(tmp, s); 
    MyString str(tmp); 
    delete tmp; 
    return str; 
} 

... ..이 내 코드입니다 잘못하고 함수가 반환 할 때 범위를 벗어나는 로컬 (스택) 변수에 대한 참조입니다. 개체가 유효하지 않으므로 컴파일러에서 경고 메시지를 표시하지 않습니다. 복사 생성자를 정의하고 값으로 개체를 반환했는지 확인하십시오 (반환 유형에서 &을 제거하십시오).

+0

나에게 무엇을 제안합니까? – JV17

+0

객체의 복사본을 반환하는 값으로 반환 할 수 있습니다 ('&'제거). – edtheprogrammerguy

+0

고마워 .. 내 문제는 뭐야 ... – JV17

1

이미 존재하는 개체가 아닌 새 개체를 반환하는 경우 참조를 반환하면 안됩니다. 참조 토큰을 제거하십시오. (당신이 생성 한 객체는 함수가 반환 될 때 destructed 될 것이므로 참조는 무효 한 객체를 대상으로합니다. 비 참조를 반환한다는 것은 객체가 원하는대로 복사/이동된다는 것을 의미합니다. . 어쨌든 복사)

또한, 당신은 인수를 수정하지 않기 때문에, 그들은 const를 선언해야하므로 const 객체 (또는 문자열 리터럴)에 전달 될 수

MyString& operator+(MyString &a); 
MyString& operator+(char *s); 

가되어야한다.

MyString operator+(MyString const &a); 
MyString operator+(char const *s); 
이 논리 거꾸로입니다

참고 :

if(s) 
    return *this; 

이됩니다 문자열 하지 null의 경우 무 조작. 나는 당신이 의미하는 것을 가정 :

if(!s) 
    return *this; 
0

당신은 당신의 함수 내 임시 MyString str(tmp); 변수를 만드는 한 다음 범위를 벗어난 간 그 변수의 메모리에 대한 참조를 반환하기 위해 노력하고 있습니다.

이 오류 메시지의 정확한 이유는 확실하지 않지만 그 반환 값을 사용하려고 시도 할 때마다 발생하는 문제입니다.

0

오류는 컴파일러가 말한 것과 정확히 같습니다. 로컬 변수에 대한 참조가 반환됩니다. 지역 변수는 스택에 저장되고 함수가 끝나면 지역 변수가 범위를 벗어나므로 지역 변수에 대한 참조를 반환하면 정의되지 않은 동작이 발생합니다.
가치에 의한 수익을 사용해야합니다.

0

또 다른 제안 : 두 개의 함수 매개 변수가있는 연산자 양식을 사용하고 참조 별 결과를 유지할 수 있습니다.

는 예를 들어 살펴 here을 가지고

관련 문제