次の例を考えてみましょう
class Foo{
public:
Foo(int i):x(i){}
int x;
};
void
bar(Foo *p2)
{
delete p2;
p2 = new Foo(2);
}
int
main()
{
Foo *p1 = new Foo(1);
cout<<p1->x;
bar(p1);
cout<<p1->x;
}
私の理解では、ポインタ変数はスタックに格納され、「指している」ヒープ上に動的に割り当てられたメモリへのアドレスが含まれています。ここで、関数にポインターを渡すと、スタック上に 2 番目のポインターが作成され、最初のポインターと同じメモリ アドレスを指します。bar() で p2 を削除して新しいメモリを割り当てると、p1 と p2 は別のアドレスを指しているはずですよね?
ただし、このコードをコンパイルすると、出力として 1 と 2 が得られます。これは、p2 が p1 が既に指しているのと同じメモリ セルを割り当てることができたからですか、それとも見逃したことがありますか?