【初心者歓迎】C/C++室 Ver.78【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0048デフォルトの名無しさん
2012/03/25(日) 19:22:51.09int型の配列を実現するクラス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; }がデストラクタです。
コードの中にどこか問題のある記述ありますでしょうか?
■ このスレッドは過去ログ倉庫に格納されています