2017-05-03 12 views
-3

하여 로컬 개체를 반환 ++,하지만 난 다음 무엇을 이해할 수 없다 :C 나는이 질문이 몇 가지 (백만) 번 요청을받은 것을 알고 참조

나는이 같은 함수가있는 경우 :

Object &function() 
{ 
    Object obj; 
    return obj; 
} 

하고이를 호출하는 클라이언트 코드 : 나는 참조 의미로 OBJ를 반환하고있어, 그 객체가되는 즉시 (종료 중괄호 후) 범위를 벗어나 파괴되기 때문에 그 나쁜

Object newObject = function(); 

. 하지만 로컬 객체를 콜 사이트의 새 객체에 전달할 때 안전하지 않아야합니까? 개체가 사라 졌을 때 복사 생성자에 의해 복사되지 않아야합니까? 알콜 객체에 대한 포인터를 전달하는 것은 나쁘다. (값에 의해) (로컬) 포인터가 범위를 벗어나면 (스택 프레임이 없어지면) 쓰레기를 가리키는 포인터의 위치를 ​​전달할 것이기 때문이다. ? 코드가 다음과 같이 동일하지 않습니다.

Object &temp = obj; 
Object newObject = temp; 

? 설명 해주십시오.

EDIT 위와 같은 질문을하지 않는 것이 동일한 것입니다. 나는 왜 내가 로컬에 대한 포인터를 리턴하지 말아야하는지, 그리고 호출 사이트에서 참조를 초기화하기 위해 로컬에 대한 참조를 리턴 할 필요가 없다는 것을 충분히 이해한다. 내가 이해할 수없는 것은 호출 사이트에서 객체를 초기화하기 위해 로컬에 대한 참조를 사용할 수없는 이유입니다. 나는 그렇게 사소하지 않다고 생각한다.

+1

차이점은 두 번째 예에서'newObject'를 만들 때'obj'가 여전히 존재합니다. 첫 번째 예제에서는'newObject'를 만들기 전에'obj'가 이미 존재하지 않습니다. 이 함수는 결과가 newObject에 할당되기 전에 변수를 완전히 반환하고 지 웁니다. –

+0

[The Definitive C++ Book Guide and List] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)를 참조 할 필요가있는 것 같습니다. –

+0

아니요, 함수가 반환되기 전에 객체가 파괴되기 때문에 * 전에 * 할 수는 없지만 * 않습니다. –

답변

1

아니요. 말씀 하셨듯이 안전하지 않습니다.

지금 파괴 된 개체에 대한 현재 잘못된 참조로 무엇을 할지라도 마찬가지입니다.

너무 늦었습니다.

+0

개체가 사라지기 전에 "저장"한다고 말할 수는 없습니까? – Luca

+1

@ 루카 예, 참조 대신 값을 반환 할 수 있습니다. 그것은 값으로 돌아 오는 것이 의미하는 것입니다. – Angew

+0

바로 값으로 돌아 오는 것이 무엇을 의미합니다. –