考虑以下示例
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;
}
据我了解,指针变量存储在堆栈中,并包含指向它“指向”的堆上动态分配的内存的地址。现在,当我将指针传递给函数时,会在堆栈上创建第二个指针,指向与第一个指针相同的内存地址。当我在 bar() 中删除 p2 并分配新内存时, p1 和 p2 应该指向不同的地址,对吗?
但是,如果我编译这段代码,我会得到 1 和 2 作为输出。这是因为 p2 设法分配 p1 已经指向的相同内存单元,还是我错过了什么?