- ベストアンサー
C++の初期化チェックに関する質問です
C++のクラスの初期化済み、未初期化を調べる方法についてご質問させていただきます。 以下のプログラムを実行するとコメント部分//Aで実行時にエラーが発生すると思います。 class Object { int *arg ; public : Object( int len ) { arg = new int[ len ] ; } public : ~Object( ) { delete[ ] arg ; } } ; int main( ) { Object obj1 = Object( 100 ) ; Object *obj2 ; obj1 = *obj2 ; // A return 0 ; } エラー理由はobj2が初期化されていないからだと分かるのですが、 プログラマー側でobj2が初期化されているか調べる方法はあるのでしょうか? 定義時にObject *obj2 = NULL ;としてif文で回避する以外に方法が ありましたら、ぜひご教授願います。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> このままプログラムが正常に終了しないことは確かであると思います。 それはなぜですか? obj2(およびobj2->arg)の取る値が"不定"だからですね。 ならば、初期化されていないことを示す値で"確定"させぬ限り 初期化されているか否かは判断できません。
その他の回答 (2)
- buriburi3
- ベストアンサー率44% (353/792)
ツールに頼る 動的検査ツールと静的検査ツール(体験版あり) http://www-06.ibm.com/jp/software/rational/products/purifyp/ http://jp.fujitsu.com/group/fst/services/pgr/product/ 類似した検査ツールは他にもあります。 VisualStudioの一番上のグレード(Professionalより上のエンタープライズ用の最上レベルの奴)やC++Builderにも同様の機能が付いてい多と思いますし、GNU C++にも同系の検査ツールがあったと思います。 ※そっちは使ったことが無いので何ともですが。
お礼
ご回答いただきありがとうございます。 今回のプログラムでは外部ツールに頼る等はしたくないため、 やはりプログラマ側のマナーに頼ることに致しました。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> 以下のプログラムを実行するとコメント部分//Aで実行時にエラーが発生すると思います。 なぜですか? 実行してみて、実際にエラーとなりましたか?
補足
まず先に言葉足らずだったことをお詫びします。 確かに//Aの部分でプログラムの実行がとまるということはないのですが、このままプログラムが正常に終了しないことは確かであると思います。 専門家の方から早急なご回答を頂けたので少し具体的な状態を説明させていただくと、=演算子をオーバーロードしているライブラリを個人的に作成しているのですが、その際にデバッグ段階で、上のような記述を行ったところでエラーとなりました。 そこで、オーバーロード側で対処したいと思い、投稿の様な内容で質問させて頂きました。
お礼
おっしゃる通りで、値が確定されていれば対処の方法もあるのですが、 確定されていないという事が分かる何かがC++の性質上あればと思い、質問させていただいたのですが、 結局のところはプログラマ側が変数の初期化をきちんと行う等のマナーをしっかり守ればこの手の問題は発生しないわけですから、そこに頼ろうと思います。 早急なご回答をいただき、ありがとうございました。