[解決済み] C++の参照変数を返す習慣は悪なのか?
質問
これは少し主観的だと思います。意見が一致しないかもしれません(参照が返されるコードスニペットをたくさん見てきました)。
に向けてのコメントによると 先ほどの質問、参照の初期化に関して というのも、参照を返すと、メモリリークにつながる削除ミスをしやすくなるからです。
気のせいでなければ)例に従って、かなりの箇所でこのようなことをしているので、心配です...。私が誤解しているのでしょうか?それは悪なのでしょうか?もしそうなら、どのように邪悪なのでしょうか?
ポインタと参照が混在している上に、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;
}
ライフタイムは呼び出し元に任せるべきで、あなたは値を計算するだけなら。
まとめ:オブジェクトのライフタイムが呼び出し後に終わらないのであれば、参照を返しても問題ない。
関連
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 変数を参照渡しする方法を教えてください。
-
[解決済み] ルール・オブ・スリーとは?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】Enterキーを押して続行する
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】C++でファクトリーメソッドパターンを正しく実装する方法