2014-12-19 3 views
1

다른 클래스의 새 객체를 반환해야하는 함수가 있으므로 공유 객체에 반환 객체를 보유해야한다고 생각합니다. 이처럼shared_ptr 반환

내부 클래스 X;

Y* func(param) 
{ 
    return new Y(param); 
} 

내가

std::shared_ptr<Y> func(param) 
{ 
    std::shared_ptr<Y> y(new Y(param)); 
    return y; 
} 

로 변경 시도했습니다 내가 로컬 개체를 반환하고 싶지 않은, 그래서 어떻게해야합니까?

+1

로컬 객체를 반환하지 않으면 사본을 반환합니다. 또한'std :: shared_ptr'입니다. 'std :: make_shared'를 사용하십시오. – user657267

+1

'share_ptr'을'shared_ptr'으로 바꾸면 작동 할 것입니다. –

+2

어느 경우에도 로컬 객체를 반환하지 않습니다. 두 경우 모두 반환 값은 * copied *입니다. 처음에는 포인터가 복사이고, 두 번째에서는 포인터가 복사됩니다. 또한 관련이 없을 수도 있지만,'std :: shared_ptr'와'std :: unique_ptr'을 * pointer *로 보지 말고, 대신에 * 소유권 * 관점에서 살펴 봐야합니다. –

답변

3

난 당신이 소유권을 이전하는 반환 형식으로 std::shared_ptrreturn std::make_shared<Y>()을하는 것이 좋습니다.

내 대답은 std::unique_ptr을 제안하는 것 외에도
#include <memory> 
#include <iostream> 
#include <string> 

class Y { 
public: 
    Y(const std::string& n) 
    : name{n} {} 

    std::string name; 
}; 

std::shared_ptr<Y> func() 
{ 
    return std::make_shared<Y>("new class"); 
} 

int main() 
{ 
    std::shared_ptr<Y> p_class = func(); 
    std::cout << p_class->name; 
    // outputs: "new class" 

    return 0; 
} 
2

소유권을 이전한다는 의미의 힙 할당 객체를 반환합니다. 나는 (그렇지 않으면 이미 사용할 수있는 경우 직접 작성) 당신이

std::unique_ptr<Y> func(param) 
{ 
    return std::unique_ptr<Y>(new Y(param)); 
} 

더 나은이 표준 : make_unique을 사용하는 것입니다 반환 형식으로 std::unique_ptr을 사용하는 것이 좋습니다 또는 것 - 표준 : make_shared - 당신이 shared_ptr을 사용하는 경우. 예외적 인 안전과 shared_ptr의 경우에 더 효율적입니다.

std::unique_ptr<Y> func(param) 
{ 
    return make_unique<Y>(param); 
} 

std::shared_ptr<Y> func(param) 
{ 
    return std::shared_ptr<Y>(param); 
} 

그리고 func 매개 변수가 복사되었습니다. 이를 피하기 위해 전달을 사용하고자 할 수 있습니다.

template<class T, class U> 
std::unique_ptr<T> make_unique1(U&& u) 
{ 
    return std::unique_ptr<T>(new T(std::forward<U>(u))); 
} 

template<class T, class... U> 
std::unique_ptr<T> make_unique(U&&... u) 
{ 
    return std::unique_ptr<T>(new T(std::forward<U>(u)...)); 
} 
0

, 나는에서 반환하는 힙에 객체를 만들 필요가 없습니다 것을 지적 할 : 여기

당신에게 도움이 될 수 있습니다 작업 예입니다 기능.

Y func(param) 
{ 
    Y result(param); 
    return result; 
} 

이 의지를 (항상있다) Y가 복사 가능한 경우 일 : 당신은 값으로 새 개체를 반환 할 수 있습니다. 클래스가 복사 불가능한 경우 작동하지 않으며 작동하는 경우 객체를 복사하는 작업이 포함될 수 있습니다.

대부분의 컴파일러는 수년간 사본을 제거했지만, 이름이 지정되지 않은 임시 객체를 반환하면 표준 C++17 표준에 따라 필수입니다. 즉, 복사 할 수없고 움직일 수없는 객체가있는 경우에도 다음 코드가 컴파일되고 새 객체를 반환합니다.

관련 문제