C++ 参照変数を返すのは悪いことでしょうか? 質問する

C++ 参照変数を返すのは悪いことでしょうか? 質問する

これは少し主観的だと思います。意見が全員一致になるかどうかはわかりません (参照が返されるコード スニペットをたくさん見てきました)。

コメントによると先ほど私が尋ねた質問は、参照の初期化に関するものです参照を返すことは、[私の理解では]削除を忘れやすくなり、メモリ リークにつながる可能性があるため、悪影響を及ぼす可能性があります。

これは心配です。なぜなら、私は例に従って(想像している場合を除き)、かなりの数の場所でこれを実行したからです... 誤解しているのでしょうか? これは悪なのでしょうか? もしそうなら、どれほど悪なのでしょうか?

ポインタと参照が混在していること、C++ の初心者であること、いつ何を使うべきかがまったくわからないことなどが相まって、私のアプリケーションはメモリ リーク地獄になっているように感じます...

また、スマート/共有ポインターを使用することが、メモリ リークを回避するための最善の方法として一般的に受け入れられていることも理解しています。

ベストアンサー1

一般に、参照を返すことは完全に正常であり、常に発生します。

もしあなたが言いたいのは:

int& getInt() {
    int i;
    return i;  // DON'T DO THIS.
}

それはあらゆる点で悪です。スタック割り当てはi消えてしまい、何も参照しなくなります。これも悪です:

int& getInt() {
    int* i = new int;
    return *i;  // DON'T DO THIS.
}

なぜなら、クライアントは最終的に次のような奇妙なことを行わなければならないからです。

int& myInt = getInt(); // note the &, we cannot lose this reference!
delete &myInt;         // must delete...totally weird and  evil

int oops = getInt(); 
delete &oops; // undefined behavior, we're wrongly deleting a copy, not the original

右辺値参照は依然として単なる参照であるため、悪質なアプリケーションはすべて同じままであることに注意してください。

関数のスコープを超えて存在するものを割り当てる場合は、スマート ポインター (または一般にコンテナー) を使用します。

std::unique_ptr<int> getInt() {
    return std::make_unique<int>(0);
}

そして、クライアントはスマート ポインターを保存します。

std::unique_ptr<int> x = getInt();

参照は、より高いレベルで有効期間が開かれていることがわかっているものにアクセスする場合にも使用できます。例:

struct immutableint {
    immutableint(int i) : i_(i) {}

    const int& get() const { return i_; }
private:
    int i_;
};

i_ここでは、呼び出し側がクラス インスタンスの有効期間を管理するので、i_少なくともその期間は存続するため、参照を返しても問題ないことがわかります。

もちろん、次のことだけでも問題ありません:

int getInt() {
   return 0;
}

有効期間を呼び出し元に任せ、値を計算するだけの場合。

要約: 呼び出し後にオブジェクトの有効期間が終了しない場合は、参照を返しても問題ありません。

おすすめ記事