2017-03-04 1 views
1

저는 C++ 98에서 C++ 11 이상으로 실제로 이동하려고합니다. 나는 새로운 것들의 대부분에 머리를 감쌌다. 그러나 나는 아직도 unique_ptr의 정확한 사용법에 대해 확실하지 않다.클래스 멤버에서 unique_ptr의 올바른 사용

클래스 A에 unique_ptr 멤버가있는 경우 (이전에 원시 포인터를 사용했을 것입니다!) 아래 예제를 고려하십시오. 이 멤버 변수는 사용자가 필요할 때 클래스의 일부가 아닌 다른 함수를 호출하여 할당해야합니다. 이것이 올바른 사용법입니까? 그렇지 않은 경우 가장 좋은 대안은 무엇입니까?

class A { 
private: 
    unique_ptr<MyType> mt; 
public: 
    void initStuff() { 
     mt.reset(std::move(StaticFuncSomewhereElese::generateMyType())); 
    } 
}; 

MyType* StaticFuncSomewhereElese::generateMyType() { 
    MyType* temp = new MyType(...); 
    //do stuff to temp (read file or something...) 
    return temp; 
} 
+2

거기에 'std :: move'가 필요하지 않습니다. 원시 포인터를 이동할 수 없습니다. – emlai

+0

@tuple_cat 그러나 이것은 완벽하게 컴파일되고 실행됩니다. –

+0

@SaeidYazdani 당신은 그것을 필요로하지 않습니다. 오히려'std :: make_unique()'를 사용하십시오. –

답변

3

코드는 잘 작동 (중복이 * move 생략 할 수 있지만)하지만 가능한 한 빨리 unique_ptr를 구성하는 더 나은 것 :

classss A { 
private: 
    std::unique_ptr<MyType> mt; 
public: 
    void initStuff() { 
     mt = StaticFuncSomewhereElese::generateMyType(); 
    } 
}; 

std::unique_ptr<MyType> StaticFuncSomewhereElese::generateMyType() { 
    auto temp = std::make_unique<MyType>(…); 
    // `make_unique` is C++14 (although trivially implementable in C++11). 
    // Here's an alternative without `make_unique`: 
    // std::unique_ptr<MyType> temp(new MyType(…)); 

    //do stuff to temp (read file or something...) 
    return temp; 
} 

이 방법은 반환이 분명하다 generateMyType 값은 호출자가 삭제해야하며 메모리 누수 가능성이 적습니다 (예 : generateMyType이 일찍 반환하는 경우).

  1. 원시 포인터를 이동할 수 없습니다 :

    때문에 move가 중복 *

    .
  2. generateMyType() 표현의 결과는 이미 어쨌든 rvalue입니다.
+2

질문은 C++ 11 태그이므로, C++ 14까지'std :: make_unique'가 도입되지 않았다는 것을 언급 할 가치가 있습니다. – user2079303

3

이것이 올바른 사용법입니까?

std::move 외에도 중복됩니다. 맞습니다. a) 노출되지 않은 포인터가 lvalues인지 rvalues인지에 관계없이 복사됩니다. b) 함수가 참조를 반환하지 않으므로 반환 값이 이미 rvalue이므로 변환 할 필요가 없습니다.

그러나 개선의 여지가 있습니다. 특히, 나는 공장 함수에서 고유의 포인터를 반환하는 것이 좋습니다 :

std::unique_ptr<MyType> StaticFuncSomewhereElese::generateMyType() 

이 초기화 예외가 발생하는 경우 누출 temp을 방지하고, 훨씬 더 열심히 공장의 사용자가 실수로 유출 할 수있게 반환 바늘.

관련 문제