質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2986閲覧

例外Catchの引数に参照渡しが推奨されているわけ

apa

総合スコア68

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/08/18 05:14

編集2020/08/18 05:19

とある書籍(More Effective C++)catchで受け取る引数に参照渡しが推奨されていうことを知りました
疑問に思ったのですが、

そもそも参照渡しとはポインタであり
その中身を送っているにすぎないです
ポインタがdeleteされてしまえば
参照渡しだろうがポインタ渡しだろうが参照することができません(例外を吐くため)
のになぜ参照渡しがいいのでしょうか?
本書にはそこに関する納得できる答えがありませんでしたので
教えていただけたらと思っております。
ただ参照は例外をはかないため値が壊れてもokなのか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

throwされたオブジェクトの寿命に関して何か不安視されているのだと思いますが,

とある書籍(More Effective C++)

その書籍の,ひとつ前の項目もあわせて読むと良いのではないかと思います.
(ざっくり言うと,catch節には,throw対象となったオブジェクトのコピー品が飛んでくる的な)

投稿2020/08/18 06:28

fana

総合スコア11708

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

ポインタがdeleteされてしまえば

参照渡しだろうがポインタ渡しだろうが参照することができません

いえ、参照は一度生成すれば参照と値を切り離すことはできませんので、ローカル変数の参照を取ってスコープアウトさせてしまうような例を除けば、「参照は生きているのにオブジェクトが存在しない」という状態にはなりません。

投稿2020/08/18 05:19

maisumakun

総合スコア145208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/08/18 05:22 編集

ポインタのnullに当たるものは参照には存在せず、参照で値を受け取る箇所では「必ず有効な値が来る」ものとしてコードを勧めることができます(きちんと渡さなければコンパイルできません)。
apa

2020/08/18 05:27 編集

なるほど そうですね となると値 ポインタがdeleteされて値が 壊れるのもしょうがないという感じですね ありがとうございました! 追記 ただ参照渡しになるとnewした値をそのまま入れられず参照用の変数を定義しなくちゃいけないので、コスト的に値渡しとそんなに変わらないのではないかと思ってしまいます
maisumakun

2020/08/18 05:27

> 値 ポインタがdeleteされて値が 壊れるのもしょうがないという感じですね どういう状況を想定しているのでしょうか?
maisumakun

2020/08/18 05:28

> ただ参照渡しになるとnewした値をそのまま入れられず参照用の変数を定義しなくちゃいけないので 逆です。例外を参照でなく値型で受け取ろうとすると、そこでコピーコンストラクタを動かす必要が出てきます。
maisumakun

2020/08/18 05:34 編集

throwでオブジェクトを投げる場合は「throw ExcepTionClass();」のように一時オブジェクトを作成するのが適切で、newを使うのは不適当です。
apa

2020/08/18 11:49

例えばこんなものです void A(const int& i) { cout << i << endl; } int main() { int* i = new int(10); int& k = *i; cout << *i << endl; A(k); delete i; A(k); cin.get(); }
apa

2020/08/18 11:54 編集

ただ参照渡しでもコピーコンストラクタは働くとおもいます。 ↑間違えました。
maisumakun

2020/08/18 12:15

例外の話はどこに行きました?
apa

2020/08/19 02:01

void A(const int& i) { cout << i << endl; } int main() { int* i = new int(10); int& k = *i; cout << *i << endl; A(k); delete i; A(k); cin.get(); } 上記についてですかね? 例外処理をいれていても入れていなくても参照の動作は変らないので 簡単に示せるほうを記述させていただきました。 例外になると参照のとらえ方が変わってしまうのでしょうか?
maisumakun

2020/08/19 02:06 編集

> 例外処理をいれていても入れていなくても参照の動作は変らないので 「投げられた例外オブジェクトを参照で受けるかそうしないか」という話をしていたつもりだったのですが、そもそもの根底が違ったようですね。 > 例外になると参照のとらえ方が変わってしまうのでしょうか? すでに上でコメントしたように、throwで投げるオブジェクトはnewで作成することそのものが不適切です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問