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

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

新規登録して質問してみよう
ただいま回答率
85.46%
例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

C++

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

Q&A

解決済

2回答

1510閲覧

C++ メンバ関数内でthrowしてもデストラクタは実行される?

ELBE

総合スコア305

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

C++

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

0グッド

0クリップ

投稿2020/04/26 11:14

C++ メンバ関数内でthrowしてもデストラクタは実行される?

クラスのメンバ関数内で例外が送出された場合、デストラクタは呼び出されますか?
デストラクタ内にコンソールに文字列を表示させる処理を追加して検証してみましたが、デストラクタは呼び出されていないように思いました。

そもそも、メンバ関数でthrowを使うのはだめなんでしょうか。

該当のソースコード

c++

1class hoge { 2 private: 3 public: 4 hoge(); 5 ~hoge(); 6 void some_func(); 7}; 8 9hoge::hoge() { /* new 処理 */ } 10hoge::~hoge() { /* delete 処理 */ } 11void hoge::some_func() { throw; } 12

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

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

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

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

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

guest

回答2

0

こんにちは。

そのインスタンスのスコープから外れる時にそのインスタンスのデストラクタが呼び出されます。
例外を投げたのがメンバ関数かどうかは無関係です。

なお、throw;は現在保留中の例外を再throwする命令です。catchブロックの中で使います。
保留している例外が無い時は単にstd::terminate()を呼び出します。ここの2)参照

C++

1#include <iostream> 2 3class hoge { 4 private: 5 public: 6 hoge(); 7 ~hoge(); 8 void some_func(); 9}; 10 11hoge::hoge() { /* new 処理 */ } 12hoge::~hoge() { /* delete 処理 */ std::cout << "~hoge()\n"; } 13void hoge::some_func() { throw 123; } 14 15int main() 16{ 17 { 18 hoge h; 19 std::cout << "h is in the scope.\n"; 20 } 21 std::cout << "h is out of scope.\n"; 22 23 try 24 { 25 hoge h; 26 h.some_func(); 27 } 28 catch(int e) 29 { 30 std::cout << "e=" << e << "\n"; 31 } 32 33 try 34 { 35 hoge h; 36 throw 456; 37 } 38 catch(int e) 39 { 40 std::cout << "e=" << e << "\n"; 41 } 42} 43 44// h is in the scope. 45// ~hoge() 46// h is out of scope. 47// e=123 48// ~hoge() 49// e=456

wandbox

投稿2020/04/26 12:08

Chironian

総合スコア23272

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

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

0

ベストアンサー

some_func() が失敗したらhogeがデストラクトされなければならないんですか?
例外は"なんかヤバいことが起こった"ことをthrowするからくりで、
デストラクトする/しないはcatch側の責任じゃないんですか?

投稿2020/04/26 11:20

episteme

総合スコア16614

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

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

episteme

2020/04/26 13:06

低評価の理由が知りたいなぁ...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問