newと例外処理

zxc
記事: 79
登録日時: 11年前
住所: 日本の背骨(?)あたり

newと例外処理

投稿記事 by zxc » 11年前

  考えても分からないものは苦手です。が、
苦手だ嫌いだ見たくないと言っても理解が深まるはず無いのでだらだらと。

  例外処理クラスについて色々疑問が出てきた。

1.Exceptionというクラスがもとから存在するらしい。
 →利用するしないに関わらず、どのようなものか知るべきだろう。しかし載っている本が身近に無いのではないか・・・  どうするか。

2.そもそも必要?
 →オブジェクト間・クラス間のやり取りは苦手。継承・フレンド関数くらいしか知らない(使用したことがあるのは継承のみ)。派生クラスが基底クラスに例外処理を任せるために例外を投げるケース等、クラス間・オブジェクト間でのやり取りは少なくないだろう。それらをクラスという形で一般化できるかというと自信がない。オーバーライドが鍵を握りそうな気もする・・・  必要だとは思うが、具体的なコードはとても書けない。

3.例外処理をするとして
  投げられたエラーを受け取って何をすれば良いだろうか・・・・  最も楽であるのは強制終了であろうが、それはいつでも適切と言える対処なのか・・・  大体の場合では適切であると思う。


newと例外処理について
 確か例外処理は例外が投げられた際、「try」の前まで(?)戻って例外を投げたような・・・  それならメモリの確保が複数回目で失敗した場合は、それまでで成功したメモリを開放するのを、例外処理でやる・・・?  

 それらに加えて、本のとおりのプログラム終了後、CPU稼働率が100%からPC再起動まで低下しないのはどこに原因があるのか・・・  CPU食っているのは別のプログラムらしいけど・・・  デバックごとに再起動なんてやってられない。おおよそのコードは以下  走らせても責任取れません。

CODE:


#include
#include

using namespace std;


int main(){
	
	double *p;

	do{
		try{
			p = new double[100000];
			cout << "メモリ割り当て成功!\n" << endl;
		}

		catch(bad_alloc xa){
			cout << "メモリ割り当て失敗\n" << endl;
			return 1;
		}
      }while(p);
	
	delete[] p;

	return 0;
}

そもそもこんな構文「p = new double[100000];」動くのかと思う文だけど本に載っているし、一応は動いた・・・  その上、この文をループして再定義にならないとかどういうことかと言いたいところだけど、vectorのように後ろに追加されていると考えれば、そこまで不自然ではないような。要するによく分からないと言うことです。

nil
記事: 428
登録日時: 12年前

Re: newと例外処理

投稿記事 by nil » 11年前

このコード、
メモリの解放が正しい箇所で行われていないので
メモリリークを起こしていますよ

zxc
記事: 79
登録日時: 11年前
住所: 日本の背骨(?)あたり

RE: newと例外処理

投稿記事 by zxc » 11年前

  メモリリークしてしまいますか;  となるとループ内に入れるべきなんでしょうが、例外を強制的に起こして、newと例外について確かめるプログラムですし・・・

  メモリリーク探知関数等使用して色々試してみます。

ISLe
記事: 2650
登録日時: 13年前

Re: newと例外処理

投稿記事 by ISLe » 11年前

例外は参照で受けたほうが良いですね。
メモリ不足なのにオブジェクトをコピーするコストを増やすとか自殺行為なので。

例外のメリットは、どんなに処理が深くなっても呼び出し元へ一気に情報を伝えることができるところです。
例外がないときは、戻り値などを使って成否をひとつずつ上に伝える必要がありました。
他の関数を呼び出しているとき、その関数が戻すステータスを呼び出す側が更に上位へ伝えるためのコードやステータスを変換する仕様を追加しなければなりません。

例外を使えば、呼び出した関数が例外を発した場合、呼び出し元がキャッチしなければそのまま上位へ流れます。
キャッチする必要があるときだけコードを追加すれば良いわけです。

ということで、例外処理はクラス間のやり取りをするだけのためのものではありません。

例外クラスというのは、よくある例外は、コードを見たとき分かりやすくなるように統一したものを使おうという意図があります。


Javaをやると例外には強くなると思いますよ。
ファイルのオープンに失敗したとかあらゆるものが例外になってますし、(最終的に)例外をキャッチしないとコンパイルエラーになる仕様ですから。
最後に編集したユーザー ISLe on 2012年11月04日(日) 16:56 [ 編集 3 回目 ]

zxc
記事: 79
登録日時: 11年前
住所: 日本の背骨(?)あたり

Re: newと例外処理

投稿記事 by zxc » 11年前

  Javaが例外に関して、そのような仕組みを持つとは知りませんでした。以前から興味があった言語ですし、多少本を読んでみます。それと、勘違いしていたようで、自分が思っていたものより、例外処理というものは自由なようですね。少し例外に対する認識が変わりました。