2012-03-17 52 views
1

次のコードスニペットでは、考慮する必要がある警告はありますか?C++の参照への参照を間接参照

void do_stuff() 
{ 
    std::unique_ptr<my_type> my(new my()); 

    my_type& mine = *my; 

    //use mine 
} 

それは私にそれが一時的に作成しますようにそれは感じているように、暗黙のポインタを参照解除することで、私の価値「を引き出す」(私はそうではありませんかなり確信している)に奇妙な感じを与える

+0

なぜこれが悪い質問であるか説明してください。 (downvoter) – Max

答えて

3

オブジェクトへの参照(またはポインタ)を保持しているときの通常の注意事項では、コードは問題ありません。オブジェクトがポインタまたは参照の使用を超えていることを確認する必要があります。この特定のケースで

unique_ptr内のオブジェクトは、私はその参照の寿命はオブジェクト自体の寿命より長生きかもしれない唯一の例だと思いますreset()またはdelete my.release();への呼び出しによって削除されないことを確認してください。

サイドノート:私はあなたがそのオブジェクトにダイナミックアロケーションを使用する正当な理由があると仮定しています。あなたがよくわからない場合は、最初にポインタ/新規を使用しないことを検討してください。

のパフォーマンスがであると仮定しています。そうであれば、参照を介したアクセスやスマートポインタがまったく同じバイナリに変換されると考えるとよいでしょう。

+0

スニペットに表示したくないのですが、このポインタを渡したいのですが、すべてのメソッドが 'std :: unique_ptr 'に依存しているとは限りません。ときには、unique_ptrにカプセル化されていないものを渡すこともあります。あなたの意見では、これは良いユースケースですか? – Max

+0

最初の質問は、オブジェクトがこの関数より寿命を超えているかどうかです。そうでない場合は、最初に動的に割り当てられたメモリを使用しないでください。 * address-of *演算子: '&obj'を使って、ローカルオブジェクトからポインタを取得することができます。動的メモリを使用する必要があり、オブジェクトの所有者*が1つしかない場合、 'unique_ptr'は問題ありません。また、ポインタ/参照を保持しない関数への未使用ポインタまたは参照を渡します。あなたの関数の持続時間もうまくいきます、あなたはちょうどインターフェイスを適応させています。 –

0

myの構成と参照の割り当ての間に実際に何もない場合は、(少なくともスニペットでは)コードは問題ありません。

+0

簡潔さと表現の間には常にトレードオフがあります。私は私の例から細部の大部分を取り除くことを選んだ。少し興味があるのなら、私のコメントの例を@DavidRodriguezに読んでください:)あなたの*意見にはそれがうまく「ユースケース」ですか? – Max

+0

@Maxそれは問題ありません。あなたのオブジェクトがフリーストアで何かを保持し、あなたが参照を渡すなら、これは問題ありません。しかし、再びクラスにオブジェクトを値で保存し、すべての問題を回避します。おかげさまで – pmr

0

ポインタが(参照の)参照を超えていることを確認します。

それを行うための一つの簡単な方法は、constを使用することです:

もちろん
void doStuff() 
{ 
    auto const p = std::unique_ptr<MyType>(new MyType); 
    MyType& m = *p; 

    // use m 
} 

、(例えばサイズ、または特別なアロケータなど)の動的割り当てを好むために、特別な理由がない場合、そしてちょうど使用MyTypeオブジェクトの自動割り当て、つまり、単語staticを使用せずに直接ローカル変数として宣言します。