에 대한 참조를 반환 내가 어떻게 참조 예를 들어 경고를받지 않고 이의를 반환해야합니다 :컴파일러 경고 로컬 객체
std::string& GetString()
{
std::string str = "Abcdefghijklmnopqrstuvwxyz";
return str;
}
int main()
{
std::string str = GetString();
}
이것은 컴파일시에 경고를 발생합니다.
에 대한 참조를 반환 내가 어떻게 참조 예를 들어 경고를받지 않고 이의를 반환해야합니다 :컴파일러 경고 로컬 객체
std::string& GetString()
{
std::string str = "Abcdefghijklmnopqrstuvwxyz";
return str;
}
int main()
{
std::string str = GetString();
}
이것은 컴파일시에 경고를 발생합니다.
예제에서 로컬 변수 str
에 대한 참조를 반환합니다. GetString()
이 반환 되 자마자 str
이 파괴되고 참조가 유효하지 않습니다 (파괴 된 개체를 나타냄).
개체에 대한 참조를 반환하는 경우 함수가 반환 된 후에도 유효 할 개체 여야합니다 (예 : 로컬 변수 일 수 없음).
이 특별한 경우에는 str
을 값으로 반환해야합니다. 참조를 반환하는 가장 일반적인 용도는 멤버 변수에 대한 참조를 반환하는 멤버 함수입니다.
기술적으로는 힙에 생성하고 참조 반환 할 수 있습니다 (편집 : 집에서 따라하지 마세요, 메모리 누수 예 (감사 제임스)) :
string& GetString() {
string * strPtr;
strPtr = new string("qweqweqwe");
string &str2 = (*strPtr);
return str2;
}
int main() {
string str = GetString();
return 0;
}
그러나 옆 교칙, 값에 의해 전달 (위에서 말했듯이) 여기서 더 나은 옵션입니다.
당신의 예제는'new'에 의해 할당 된 문자열을 누설합니다. –
개체를 다시 복사하지 않으려합니다. – user13645
@user : 물건을 복사 할 때 아무 문제가 없습니다. 그것은 항상 끝났고, 항상 끝내야합니다. 성능에 대해 걱정하지 말고 훌륭한 코딩 방법에 대해 걱정하기 시작하십시오. 귀하의 질문과 같이 참조를 어떻게 든 반환 할 수 있다고해도 고려하십시오. 'std :: string str = GetString();'은 어떻게됩니까? 'str'은 그것이 참조인지 아닌지에 관계없이'GetString'에 의해 반환 된 값의 * copy *입니다. – GManNickG
값을 반환하지 않습니다. – GManNickG
은 항상 스택에있는 객체를위한 것입니까? – user13645
일반적으로 함수 호출과 독립적으로 존재할 값을 함수가 반환해야하는 경우 참조를 반환합니다. – GManNickG