1. ホーム
  2. c++

[解決済み] C++の参照変数を返す習慣は悪なのか?

2022-03-14 17:14:59

質問

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

に向けてのコメントによると 先ほどの質問、参照の初期化に関して というのも、参照を返すと、メモリリークにつながる削除ミスをしやすくなるからです。

気のせいでなければ)例に従って、かなりの箇所でこのようなことをしているので、心配です...。私が誤解しているのでしょうか?それは悪なのでしょうか?もしそうなら、どのように邪悪なのでしょうか?

ポインタと参照が混在している上に、C++初心者で、何をいつ使えばいいのか全く分からないので、私のアプリケーションはメモリリーク地獄に違いないと感じています......。

また、一般的にメモリリークを防ぐにはスマート/シェアードポインタを使用するのが良いとされているようですが、どのようにすれば良いのでしょうか?

どのように解決するのですか?

一般に、参照を返すことはごく普通のことで、よくあることです。

ということであれば

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

rvalueの参照は単なる参照なので、すべての邪悪なアプリケーションに変わりはないことに注意してください。

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

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;
}

ライフタイムは呼び出し元に任せるべきで、あなたは値を計算するだけなら。

まとめ:オブジェクトのライフタイムが呼び出し後に終わらないのであれば、参照を返しても問題ない。