progC.pdf progC-s.pdf progC-e.pdf 記事一覧 |
delete 演算子の誤用(?) |
progC-e.pdf に [#7: 参考] に関連するC++のプログラムを示します.
p1.cpp の実行結果は上図のようになりました ---「delete」の使い方が間違っているようなので分かり次第追記します.
/* --- p1.cpp (半角 < を全角 < で置換)--- */
//#include <iostream.h> //「#include <stdio.h>」不要,警告あり
//#include <iostream> //「#include <stdio.h>」不要,警告なし
#include <stdio.h> // 勿論「#include <iostream>」不要
class Complex{
public:
double r, i;
Complex(void){r = i = 0;}
Complex(double x, double y){
r = x; i = y;
}
void add(Complex z){
r += z.r; i += z.i;
}
void add(double x, double y){
r += x; i += y;
}
};
int main(void){
Complex z(2, 3), *p;
printf("%.2f, %.2f\n", z.r, z.i);
z.add(2, 3);
printf("%.2f, %.2f\n", z.r, z.i);
p = &z;
p = new Complex(1, -2);
printf("%p, %.2f, %.2f\n", p, p->r, p->i);
delete p; printf("*p deleted ?\n");
printf("%p, %.2f, %.2f\n", p, p->r, p->i);
p->r = 5; p->i = 8;
printf("%p, %.2f, %.2f\n", p, p->r, p->i);
//
int *q; q = new int;
*q = 123; printf("*q == %d\n", *q);
delete q; printf("*q == %d\n", *q);
return 0;
}
参考資料($[n]は本文でも引用, *.pptはブロック解除が面倒なので未調査):
[1] newしたのにdeleteしない by 熊谷
http://gimite.net/bcbqtree/qtreemain.cgi?mode=thread&thread=1461
p=ch; の動作でchの指すアドレスをpに上書きしてしまったために・・・
※ p1.cpp では "*p deleted ?\n" の直後でも活きているようです.(配列ではないから当然?)「delete[] p;」も無効.
※コメント投稿者のブログIDはブログ作成者のみに通知されます