• ベストアンサー

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文で回避する以外に方法が ありましたら、ぜひご教授願います。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

> このままプログラムが正常に終了しないことは確かであると思います。 それはなぜですか? obj2(およびobj2->arg)の取る値が"不定"だからですね。 ならば、初期化されていないことを示す値で"確定"させぬ限り 初期化されているか否かは判断できません。

Prog_HIGE
質問者

お礼

おっしゃる通りで、値が確定されていれば対処の方法もあるのですが、 確定されていないという事が分かる何かがC++の性質上あればと思い、質問させていただいたのですが、 結局のところはプログラマ側が変数の初期化をきちんと行う等のマナーをしっかり守ればこの手の問題は発生しないわけですから、そこに頼ろうと思います。 早急なご回答をいただき、ありがとうございました。

その他の回答 (2)

  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.3

ツールに頼る 動的検査ツールと静的検査ツール(体験版あり) 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++にも同系の検査ツールがあったと思います。 ※そっちは使ったことが無いので何ともですが。

Prog_HIGE
質問者

お礼

ご回答いただきありがとうございます。 今回のプログラムでは外部ツールに頼る等はしたくないため、 やはりプログラマ側のマナーに頼ることに致しました。

回答No.1

> 以下のプログラムを実行するとコメント部分//Aで実行時にエラーが発生すると思います。 なぜですか? 実行してみて、実際にエラーとなりましたか?

Prog_HIGE
質問者

補足

まず先に言葉足らずだったことをお詫びします。 確かに//Aの部分でプログラムの実行がとまるということはないのですが、このままプログラムが正常に終了しないことは確かであると思います。 専門家の方から早急なご回答を頂けたので少し具体的な状態を説明させていただくと、=演算子をオーバーロードしているライブラリを個人的に作成しているのですが、その際にデバッグ段階で、上のような記述を行ったところでエラーとなりました。 そこで、オーバーロード側で対処したいと思い、投稿の様な内容で質問させて頂きました。

関連するQ&A

  • 【C++】オブジェクト配列の動的確保

    Objectがクラスとして、以下のようなプログラムを書きました Object **obj; obj = new Object*[100]; for(i=0;i<100;i++){     obj[i] = new Object(a,b,c);     obj[i]->Run();     delete obj[i]; } delete [] obj; するとdeleteの所でエラーになります。 (確保していない領域をdeleteしようとしたときのような) 何か間違っているのでしょうか。 何故かデバッガでは通ってしまいます。 環境:XP、VisualStudio2005 何卒よろしくお願いいたします。

  • 整数値を任意のオブジェクトを格納できるスタッククラスに格納する方法

    class ObjStack { private Object[] mBuf; private int mSP; public ObjStack(int size) { mSP = 0; mBuf = new Object[size]; } public int getSize() { return mBuf.length; } public int getNum() { return mSP; } public boolean isFull() { return mSP == mBuf.length; } public boolean isEmpty() { return mSP == 0; } public void push(Object x) { if (!isFull()) { mBuf[mSP++] = x; } } public Object top() { Object obj = null; if (!isEmpty()) { obj = mBuf[mSP-1]; } return obj; } public Object pop() { Object obj = null; if (!isEmpty()) { obj = mBuf[--mSP]; } return obj; } } 上のプログラムは任意のオブジェクトを格納できるスタッククラスです。 int型の値はオブジェクトではないので、このObjyStackクラスに格納することができない。 整数値をこのObjStackクラスに格納する方法を教えて下さい。

    • ベストアンサー
    • Java
  • javaの質問です。その2

    明日JavaのBronze試験を受けに行くのですが、全然わからずに困っています。 紫色のJavaプログラマBronzr[SE7]という本を使用しています。 本の模試の問題です。 38 Class Foo{ static int val; static int methodA() {return ++val;} } Class Test{ public static void main(String[] args){ Foo.obj =new Foo(); obj.methodA(); }} } この問題では int valと宣言していますが、初期化をしていません。 なのでnullのはずなのですが、 なぜ++valで1になるのかがよくわかりません。 null+1は計算できないと思うのですが、、、、、 明日テストなので本当に困っています。

    • ベストアンサー
    • Java
  • Cのソースコード について

    使用言語はCです。 #include<stdio.h> #include<math.h> int main(void) { double x = 0, y = 0; while (1) { double arg2 = M_PI / 90; int arg1 = 90; int Arg = 0, Len = 0; scanf_s("%d,%d", &Len, &Arg); if (Len == 0 && Arg == 0) { break; } else { arg1 -= Arg; arg2 += (arg1 % 360)*M_PI / 180; x += cos(arg2)*Len; y += sin(arg2)*Len; } } printf("%d\n%d\n", (int)x, (int)y); while (1) {} return 0; } このコードをvisual studio でコンパイルしようとすると、 M_PIは定義されていない とエラーになってしまいます。 M_PIはmath.hに含まれているということでつかったのですが・・・・

  • C#で配列のフィールドを取得したい

    C#2.0を試用しています。 次のような書き方ではプリミティブ型は取得できるのですが、 配列のフィールドは取得できないので、 なんとかして取得する方法はないのでしょうか? public class MasterClass {  public int a = 2;  public int[] b = new int[] { 1, 2 };//←取得できない } Object obj = new TestClass(); Type type = obj.GetType(); foreach (FieldInfo fi in type.GetFields()) {  object tmp = fi.GetValue(obj);  Console.WriteLine(fi.Name + ":" + tmp); } System.Console.ReadLine();

  • 変数の初期値

    へんてこな質問かもしれません・・・ class Syokika{   public static void main(String args[]){     int[] a = new int[1];     System.out.println(a[0]);   } } を実行するとどうなるかという問題なのですが、 「変数が初期化されていない」 というエラーが出ると思っていたのですが、 答えは「0と表示される」でした・・・ で、解説を見ると、「配列が生成されるときに初期値が生成される。intの場合は0だ」と書いてありました。 でも、たんにint a;とした場合にaを参照しようとすると初期化されてないですよね・・・? これはどういうことなのでしょうか・・・?

    • ベストアンサー
    • Java
  • クラスから自分のオブジェクトを操作するには

    高橋麻奈著の「やさしいJava」を買って、Javaプログラミングをはじめたのですが、どうしても分からないことがあるので質問させてください。 次のようなコードがあります。 class Abc{  public static void main(String arg[]){   Def de = new Def();   de.object_null();   Def de2 = new Def();   de2.object_null();   Ghi gh = new Ghi();   gh.object_null();  } } class Def{  int d,e,f;  Abc abc;  Def(Abc a,int i1,int i2){   //略  }  public void object_null(Abc a){   abc = a;   abc.de = null;  } } class Ghi extends Def{  Ghi(Abc a,int i1,int i2){   super(a,i1,i2);  } } Defクラス側から自分自身のクラス変数deをnullにする場合、public void object_null()メソッドのような方法でクラス変数を指定してnullにしていました。 しかし、この場合、クラス変数de2のobject_null()メソッドではde2をnullできないし、 サブクラスGhiから、クラス変数ghをnullにする場合も、クラス変数deを指定してしまいます。 クラス側から自分自身のクラス変数を指定する良い方法を教えてください。 よろしくお願いします。 #ここは半角スペース無効なんですね(^^;

    • ベストアンサー
    • Java
  • C#で実行時にメソッドの返り値の型を変化させる

    C# で、実行時にメソッドの返り値の型を変化させることは可能でしょうか? たとえば、 public class MyData { object o; public void setValue( object a ) { o = a; } public object getValue() { return o; } } というクラスがあるとき、 static void Main(string[] args) { MyData a = new MyData(); a.setValue( 3 ); Console.WriteLine( a.getValue().GetType().ToString() ); int i = (int)a.getValue(); } というコードを実行すると、 System.Int32 と表示されます。Main の 4 行目で、(int)のキャストをはずすと、object から int への暗黙の変換はできませんというコンパイルエラーになります。 この(int)のキャストをしなくてもエラーにならないような getValue の関数はできないでしょうか? o は、数値型であるとします。 たとえば、MyData に、 public int getInt() { return (int)o; } とすれば、必ず int を返すようなメソッドはできると思うのですが、これだと、getByte() や、getDouble() などのように、考えられるすべての型を想定してメソッドを作ることになってしまいます。 そうではなく、getValue() で、少なくとも数値型の暗黙の変換はしてくれるようなことにできないでしょうか。 よろしくお願いします。

  • 参照代入

    class ApBase extends Object implements Runnable (省略) ApBase aBase = new ApBase(); Object obj = aBase; Runnable rn = obj; × コンパイラにとってobjはObjectなのでRunnnableインターフェイス参照への代入は認められません。 -----ー---- 以前質問させてもらった内容の一部なのですが・・・ 参照代入でコンパイルエラーを引き起こす場合 「is a」の関係が成り立っていない場合ですよね? なぜコンパイルエラーなのですか? Objectクラスはすべてのクラスのスーパークラスですよね・・・ Runnableとobjectはis aではないのでしょうか??????

    • ベストアンサー
    • Java
  • JAVAのequalsメゾットに関して

    public class Sample{ private int num; public Sample(int num){ this.num=num; public boolean equals(Sample obj){ if(obj==null){ return false; } return this.num==obj.num; } } ここでのequalsメゾットは、object同一性を比較するものか、それともobejectの同値性を比較するものでしょうか? また、オブジェクトクラスの中のequalsメゾットをみたら return(this==obj); と書かれていますが、これを見る限り同一性を比較するものだと思いますが、「objectクラスのequalsメゾットは同値性を比較するメゾット」と書かれているサイトも多くて、一体どっちが正しいでしょうか? ご回答いただければ幸いです。よろしくお願いいたします。 ※OKWAVEより補足:「Webシステム開発」についての質問です。

    • ベストアンサー
    • Java

専門家に質問してみよう