ぼんさい塾

ぼんさいノートと補遺に関する素材や注釈です.ミスが多いので初稿から1週間を経た重要な修正のみ最終更新日を残しています.

g++による演習 (1)

2014-01-28 14:15:22 | 暮らし
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;」も無効.



最新の画像もっと見る

コメントを投稿