2012-08-25 5 views
0

이것은 내가 생각하는 것입니다 :반환되는 값 반환 유형은 객체의 참조입니까?

함수가 반환하면 객체의 새로운 임시 복사본을 만들고이 임시 객체는 호출 된 곳의 명령문의 시간 동안 메모리에 남아 있습니다.

함수가 참조를 반환 할 때 개체 자체가 반환됩니다. 이는 해당 객체가 로컬이 아니어야 함을 의미합니다. 내가

MyStruct d("notmyname"),g("myname"); 
d = ReferenceReturn(g); 
cout << d.name; 
cout << ReferenceReturn(g).name; 

그것은 모두에서 쓰레기를 인쇄

을() 주에

MyStruct & ReferenceReturn(MyStruct cl) 
{ 
     return cl; 
} 

:

그래서 나는이 작업을 수행 할 때.

무엇이 반환됩니까? : 함수가 끝나자 마자 파손되는 g의 로컬 복사본 또는 명령문이 끝난 후 파기되는 임시 객체에 대한 참조를 참조합니다. 그러나 만일 임시 직원이 만들어지면 올바른 방법으로 d를 덮어 쓸 것입니다. 그래서 그것은 전달 된 값의 반환 된 localcopy 참조를 믿습니다.

하지만 구조체에서 소멸자를 만들 자마자 다음 코드와 특정 출력으로 완벽하게 처리됩니다.

~MyStruct() 
{ 
    cout << name << " is destroying"; 
    } 

출력 :

myname is destroying 
myname 
myname 
myname is destroying 
.... 

이 출력은 하나의 목적은 각각의 호출에 대해 생성되는 것을 나타낸다. (두 번의 호출이 있습니다)

그러나 왜 소멸자 없이는 작동하지 않습니까?

감사

+0

그런 경우 결과가 정의되지 않습니까? –

답변

2
MyStruct & ReferenceReturn(MyStruct cl) 
{ 
     return cl; 
} 

는 이의를 reference를 반환 cl에 할당, 파괴 오브젝트를 temporary object를 만듭니다. 그래서, 그것은 dangling reference입니다. 컴파일러는 copy-elision를 사용할 수 있으며 개체를 복사하지 않습니다,하지만 ...

MyStruct & ReferenceReturn(MyStruct& cl) 
{ 
     return cl; 
} 
+0

개체가 문 뒤에 소멸되는 것을 발견했습니다. 소멸자를 추가하면 출력이 다음과 같이됩니다. << ReferenceResult (g) << endl; 그래서이 행이 완료된 후 객체가 파괴됩니다. –

+0

@ASHISHNEGI copy-ctor에 추적을 삽입하는 방법은 어떻습니까? http://liveworkspace.org/code/8077039f76b8b4a52d09977b94f31155하지만 MSVC 결과는 동일하지 않습니다.따라서 이러한 사용법은 표준에 따라 올바르지 않습니다. – ForEveR

+0

보시다시피, 전달 된 객체의 소멸자 ouput "d-tor"는 "cout"문 뒤에 "0"을 출력합니다. 이것은 문이 끝나기 전에 객체가 좋다는 것을 의미합니다. 그래서 그것의 작동 ..하지만 내가 소멸자 및 복사 생성자를 제거; 제 경우에는 쓰레기가 인쇄됩니다. –

1
MyStruct & ReferenceReturn(MyStruct cl) { 
    return cl; 
} 

같은 경우에 정의되지 않은 결과가 lile 뭔가를 사용할 수 없다?

이 함수는 정의되지 않은 동작을 나타냅니다. 문제는 cl이 함수의 로컬 객체이므로 해당 참조를 반환한다는 것입니다. 이것은 정의되지 않은 동작입니다. 호출자는 ReferenceReturn에 전달할 g 복사본을 만들고 return 이후에 해당 복사본을 ReferenceReturn 함수로 삭제합니다.이 호출자는 호출자가 참조를 사용하기 전에 잠재적으로 손상시킬 수 있습니다.

+0

"호출자가 참조를 사용하기 전에 잠재적으로"소멸자 없이는 당신이 옳습니다. 내가 오른쪽 destuctor 뭔가 다른 일이 -> 함수의 로컬 사본은 cout 문 후 파괴지고있다. 그래서 소멸자가 여기에 somehing하거나 그것을 당신이 말한대로 정의되지 않습니다. –

+0

@ASHISHNEGI : 어떻게 명확하게 할 수 있는지 모르겠습니다.이 함수는 정의되지 않은 동작을 보여줍니다. 정의되지 않은 동작은 작동하는 것처럼 보일 수 있거나 잘못된 결과를 제공하거나 응용 프로그램을 중단시킬 수 있음을 의미하지만 모든 경우에 여전히 정의되지 않은 동작입니다. –