- 48 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 19:22:51.09 ]
- nelem(要素数),vec(*int)をメンバに持ち、コンストラクタでnew int[nelem]によって
int型の配列を実現するクラスIntArrayがあり C++で自己初期化(IntArray x = x)を抑制するコピーコンストラクタを作ろうとしました 自己初期化の問題は、左辺のIntArray xの宣言子よりxは生成されるので 右辺のxはコンパイルエラーにならないが、この右辺xは未初期化(デフォルトコンストラクタにもかからない)なので 結果としてxのメンバが不定値で設定されてしまうことにあるということです IntArray x=x;はダメだが、 IntArray t;// default constructor x=t; //IntArray::operator=が定義済み。 にするとうまくいく。そこで、下のようにコピーコンストラクタを定義しました IntArray::IntArray(const IntArray& x){ if(&x != this){ /*自己初期化ではない*/ nelem = x.nelem; vec = new int[nelem]; for(int i=0;i<nelem;i++) vec[i] = x.vec[i]; } else{ std::cout << "※自己初期化が行われています。\n"; IntArray t; *this = t; } } するとコンパイルエラーは出ないものの実行すると *** glibc detected *** ./a.out: free(): invalid pointer: 0xb763bff4 *** となり、どこかでメモリの開放がうまくできていないのかプログラムが強制終了してしまいます。 前後左右でチェックして明らかに*this = t;に問題があります。 ~IntArray() { delete[] vec; }がデストラクタです。 コードの中にどこか問題のある記述ありますでしょうか?
|

|