2

コードのどこかに local がありstd::unique_ptr<T>ます。指しているオブジェクトを操作する必要があり、そのために関数を使用します。

std::unique_ptr<T> some_function( std::unique_ptr<T> &t )
{
    // do stuff
    return t;
}

この関数を次のように呼び出します。

std::unique_ptr<T> some_T_ptr( new T(/*args*/) );
vector_of_finalized_Ts.push_back( std::move(some_function(std::move(some_T_ptr))));

必要な機能を取得するためのより良い方法はありますか? 2 つの動きはかなり不必要であり、潜在的に危険なようです。ここには示していないエラー処理コードがありますが、それは重要ではありません。

4

3 に答える 3

4

それはすべて所有権に関するものです。ポインタの所有権を取得しますsome_functionか? そうでない場合は、生のポインターを に渡すだけですsome_functionsome_function所有権を取得する (そして所有権を返す) 場合は、by 値を使用する必要がありますunique_ptr。そうしないと、return ステートメント ( である必要がありますstd::move(t)) は、不明な起源の参照から移動します。

std::unique_ptr<T> some_function( std::unique_ptr<T> t )
{
    // I own t here and will delete it if an exception happens
    // do stuff
    // I'm transferring ownership back to the caller
    //     (who may or may not accept ownership)
    return std::move(t);
}

vector_of_finalized_Ts.push_back( some_function(std::move(some_T_ptr)));

また:

void some_function( T* t )
{
    // I don't own t and won't delete it if an exception happens
    // do stuff
}

some_function(some_T_ptr.get());
vector_of_finalized_Ts.push_back( std::move(some_T_ptr));

どちらのデザインでも構いません。どのコードがポインターを所有する必要があるかによって異なります (特に、ある時点で例外がスローされた場合)。

于 2011-05-07T19:21:46.837 に答える
0

(コード内の無関係な構文エラーを無視します。これについては、上記の私のコメントを参照してください。)

スニペットに関する限り、コードは有効です。移動の冗長性は、この方法で使用するため、およびオブジェクト自体への参照ではなく関数std::unique_ptrにを渡すために支払う価格です。unique_ptr

some_function私はあなたが取りたいと思うあなたの正当な理由があると思います、std::unique_ptrそしてもしそうなら、私が言うことができる限りあなたは本当にこれ以上のことはできません。

あなたがあなたの正当な理由を持っていないなら、まあ、あなたの答えがあります。:)

お役に立てば幸いです。

于 2011-05-07T19:01:46.450 に答える
0

あなたの問題は、unique_ptr参照によって取得し返すことです。これは一意のポインターです。共有ポインターのように扱っているためnullptr、スタックに無駄な値が残っています。値または右辺値参照で取得した場合は、 some_function を直接呼び出すだけで済み、結果を移動する必要はありません。

std::unique_ptr<T> some_function( std::unique_ptr<T> &&t )
{
    // do stuff
    return t;
}
vector_of_finalized_Ts.push_back( some_function(std::unique_ptr<T>(new T(...))));
于 2011-05-07T19:15:04.913 に答える