web-dev-qa-db-ja.com

unique_ptrを割り当てるかリセットする必要がありますか?

所有オブジェクトの寿命がその所有者にリンクされている一般的な状況を考えると、2つの方法のいずれかで一意のポインターを使用できます。 。

割り当て可能:

class owner
{
    std::unique_ptr<someObject> owned;    
public:
    owner()
    {
        owned=std::unique_ptr<someObject>(new someObject());        
    }
};

リセット方法を利用できます:

class owner
{
    std::unique_ptr<someObject> owned;    
public:
    owner()
    {
        owned.reset(new someObject());
    }
};

ベストプラクティスの観点から、ある形式を他の形式よりも優先する必要がありますか?

編集:ごめんなさい。これを単純化しました。ヒープの割り当ては、ctorではなく、initializeメソッドで行われます。したがって、初期化リストを使用できません。

60
learnvst

_unique_ptr_の_operator=_のドキュメント から:

Rが指すオブジェクトの所有権を、reset(r.release())に続いてstd::forward<E>(r.get_deleter())からの割り当てを呼び出すかのように* thisに転送します。

必要なのはreset呼び出しだけなので、直接呼び出すだけの方が簡単です

38
Kos

これを行うための適切な方法(リストしなかった)は、ownedのコンストラクターを使用することです。

owner() : owned(new someObject())
{}

それとは別に、resetをお勧めします。その場合、無駄な中間インスタンスを作成しないためです(オプティマイザーが多くのことを行えるので、マシンレベルで違いはないかもしれませんが)。

15
filmor