2013-06-13 4 views
4

이러한 코드가 있습니다.함수의 auto_ptr 반환 값

MyClass MyClass::get_information (const some_datastructure *record) 
{ 
    auto_ptr<MyClass > variable (new MyClass()); 

    variable ->set_article_id(record->article_id); 

    return *variable.get(); 
} 

본인은 MyClass 유형의 개체 (사본?)를 반환한다는 것을 알고 있습니다. 초기에, 나에게 이해가되지 않는 auto_ptr 객체를 반환하고 있다고 생각 했었습니다. (?) 범위를 벗어날 때 auto_ptr 객체가 파괴되었다고 생각했기 때문에 생각했습니다.

어쨌든 위의 코드가 맞습니까? 함수가 반환 될 때/후에 객체 *variable.get()이 존재합니까?

+0

일반적으로 나는'auto_ptr'을 사용하는 코드가 너무 취약하여 "ok"라고 생각하지 않을 것입니다. 하지만 너무 열정이있는 수업은 싫어. 'std :: unique_ptr'을 사용할 수 있습니까? 그렇다면, 걷지 말고 실행하십시오. – Yakk

답변

3

는, 그래, 객체, 괜찮 ... 는 일반 변수로 간단하게 다음과 같습니다

MyClass var; 
var.set_article_id(record->article_id); 
return var; 
+0

안녕하세요, 그 의미에서 함수 오른쪽에서 모든 로컬 변수 (_given_ 클래스 개체)를 반환 할 수 있습니까? 그 복사본이 만들어지기 때문에? –

+0

예, 값으로 돌아 오는 한 거의 모든 것을 반환 할 수 있습니다. 객체가 큰 클래스 또는 많은 요소가있는 벡터처럼 복사하는 데 비용이 많이 든다면 조금 까다 롭습니다 ... –

+0

예하지만 C++ 0x rvalue 참조가 도입되었습니다. 이렇게하면이 'MyClass localVar = FuncReturningValue();'와 같은 것은 실제 복사본 하나에서만 작동합니다. – Paranaix

3

예는

실제로는 포인터의 기본 목적의 임시를 rvalue 사실 복사본을 생성한다. 반환 유형은 MyClass*이 아니라 MyClass입니다. 그 이유는 복사본이 반환됩니다. *variable.get()도 rvalue를 산출합니다. 이 값에 의해 반환 된 이후이 문제에 대한 포인터 나 힙 할당의 사용을 이해하지 않지만