[解決済み] throw new std::exception vs throw std::exception
質問
あるコードを見ているときに、偶然見つけました。
throw /*-->*/new std::exception ("//...
を使う必要はない/使うべきでない、といつも思っています。
new
を使う必要はないと思っていました。
正しい方法は何ですか、どちらもOKですか、もしそうなら何か違いがありますか?
ところで、私が見たところ、PowerShell のブーストライブで "grepping" をするとき、決して
throw new
.
追伸:また、いくつかのCLIコードで
throw gcnew
. これはOKですか?
どのように解決するのですか?
例外のスローとキャッチの従来の方法は、例外オブジェクトをスローし、それを参照でキャッチするものです(通常は
const
参照) でキャッチします。C++言語では、コンパイラが例外オブジェクトを構築するための適切なコードを生成し、適切なタイミングでそれを適切にクリーンアップすることが要求されます。
動的に割り当てられたオブジェクトへのポインタを投げることは、決して良い考えとは言えません。例外は、エラー状態に直面したときに、より堅牢なコードを書くことができるようにするためのものです。従来の方法で例外オブジェクトを投げる場合、それが正しい型を指定した catch 節によって捕捉されるか、あるいは
catch (...)
で捕捉されようが、再スローされようが、適切なタイミングで正しく破棄されることを確信できます。(唯一の例外は、それがまったくキャッチされない場合ですが、これはどのように見ても回復不可能な状況です)。
動的に割り当てられたオブジェクトへのポインタを投げる場合、例外を投げたい時点でコールスタックがどのように見えても、正しいポインタの型を指定するキャッチブロックがあり、そのブロックに適切な
delete
を呼び出す必要があります。例外は決して
catch (...)
ただし、そのブロックが例外を再スローし、その例外を正しく処理する別のキャッチブロックによってキャッチされる場合はこの限りではありません。
事実上、これは堅牢なコードを書くことを容易にするはずの例外処理機能を取ってしまい、すべての状況で正しいコードを書くことを非常に困難にしてしまったことを意味します。これは、この機能を期待していないクライアントコードのために、ライブラリコードとして動作することがほとんど不可能になるという問題はさておきです。
関連
-
[解決済み】coutはstdのメンバではない
-
[解決済み] 投げる」と「投げる元」は違うのですか?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] Pythonで例外を表示するには?
-
[解決済み] noexceptを本当に使うべきはいつですか?
-
[解決済み] Javaにおける例外処理によるパフォーマンスへの影響とは?
-
[解決済み] 例外を発生させるタイミングは?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】C++の余分な資格エラー
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。