演算子のオーバーロード
座標を表すクラスとして
class Point {
public:
double *buf;
Point(double, double) {
printf("new :%p ", buf);
buf = new double[2];
buf[0] = x1;
buf[1] = x2;
printf("-\n");
}
~Point() {
printf("delete :%p ", buf);
delete [] buf; // ※1
printf("- \n");
}
Point operator +(Point){
Point a(0.0, 0.0);
a.buf[0] = this->buf[0] + p.buf[0];
a.buf[1] = this->buf[1] + p.buf[1];
return a;
}
Point operator =(Point){
this->buf[0] = p.buf[0];
this->buf[1] = p.buf[1];
return *this; // ※2
}
};
int main() {
{
Point a(1.0, 2.0);
Point b(3.0, 4.0);
a = a+b; //(1)
a = a+b+a+b; //(2)
a = (a=b) + (b+b); //(3)
printf("(%f, %f)\n", a.buf[0], a.buf[1]);
}
return 0;
}
を作成し、(1),(2),(3)のいずれかを記述して実行したところ、
(1)
正常に動作(4,6)
(2)
セグメンテーションフォルト
※1 を削除すると(8,12)
(3)
セグメンテーションフォルト
※1 を削除すると(9,12)
という結果になりました。
Deleteで(同じアドレスを開放しようとして)失敗しているようなのですが、思った動作をさせるためにはどうすればよいでしょうか。
標準出力を載せたいのですが、文字数制限により無理のようなので、後ほど補足致します。
環境
Windows XP SP2
Cygwin 1.5.19(0.150/4/2)
GCC 3.4.4
お礼
無事に動作いたしました。 ありがとうございました!