delete演算子がどう働くかいまいちわからない

newで動的に確保したメモリの解放をしたいわけなんだけど、delete演算子がいまいちなにしてるのかよくわからない。

  • delete演算子は、ポイントしてる先の確保領域を解放する?
  • delete演算子は、ポインタ変数そのものを解放する?

不思議におもったのは、以下のコードで、

// pointer_memory.cpp
#include <iostream>

using namespace std;

int main()
{
    int *a, *b, *c;

    a = new int(1);
    b = a;
    c = b;

    cout << *a << endl;
    cout << *b << endl;
    cout << *c << endl;

    cout << a << endl;
    cout << b << endl;
    cout << c << endl;

    delete a;

    cout << *a << endl;
    cout << *b << endl;
    cout << *c << endl;
    return 0;
}

実行すると、

1
1
1
0x100150
0x100150
0x100150
1
1
1

deleteしてんのに、その後に a の実体とか見にいけちゃうの?bとcはaと同じ場所をポイントしてて、そこを参照できるってことは、aの参照先そのものは解放してないのか?それとも解放したけど、解放しましたってことをプログラムが認識してるだけでメモリ上の値は残ってるってことかな?

で、さらに不思議に思ってるところが、上のプログラムを

// pointer_memory_delete.cpp
#include <iostream>

using namespace std;

int main()
{
    int *a, *b, *c; 

    a = new int(1);
    b = a;
    c = b;

    cout << *a << endl;
    cout << *b << endl;
    cout << *c << endl;

    cout << a << endl;
    cout << b << endl;
    cout << c << endl;

    delete a;
    delete b;

    cout << *a << endl;
    cout << *b << endl;
    cout << *c << endl;
    return 0;
}

って変えてやると、

1
1
1
0x100150
0x100150
0x100150
a.out(10430) malloc: *** error for object 0x100150: double free
*** set a breakpoint in malloc_error_break to debug
1
1
1

って警告がでる。つまり、delete a で解放した気な場所をもっかい解放しようとするなよって警告だと思うんだけど。
てーことは、やっぱりaの参照先を解放してて、その後値を見れちゃうのは、たまたまそのメモリ上に値がのこってたからってだけのはなしですかねー?



(追記)
ちなみに環境は以下。

% g++ --version
i686-apple-darwin9-g++-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5490)
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

エロい人にきかないとわかんね。

もうちょい調べてみますかー。


[結論] -> delete後の扱い - sotarokのお勉強