为什么说这个代码片段包含错误?

Why this code snippet said to contain error?

我通常知道,* 和 & 标志。但是我们的老师给了我们一个例子,她说 "Problem occurs here"

int *a1;
int *a2 = new int[100];
a1=a2 //What does this line mean???
delete []a2;

k=a1[0]//she said error occurs here.

我不明白 a1 = a2 是什么? 为什么会出现错误?

a1=a2之后,a1a2都指向相同的内存位置。

那么当你运行delete a2[]时,a2指向的内存就被释放了。而且由于a1a2指向同一个内存位置,所以a1也是无效的。

然后当您取消引用 a1 时,它指向释放的内存,您调用 undefine behavior.

它使 a1a2 具有相同的值。由于 a2 是指向动态分配数组的指针,所以它是 a1。当您释放与该数组关联的内存时,就会出现问题。 a1 仍然保存着现在不存在的数组的地址,并且很可能所有涉及取消引用 a1 的操作,例如 k=a1[0] 将导致非法内存访问。

a1=a2 //What does this line mean???

=就是assignment operator。这实际上是将 LHS 操作数的值赋给 RHS 操作数。

这里,这一行的意思是,将a2的值赋值给a1,即把a2指针赋值给a1。即a1a2指向同一个内存位置。

现在,一旦您用 a1 调用 delete[],它实际上释放了内存。然后,访问 a1[i]a2[i] 是相同的,访问已经释放的内存调用 undefined behavior.

为了帮助理解,请考虑将两根吸管放入一杯果汁的类比。一旦你用一根吸管喝完果汁,你就不能再用另一根吸管喝果汁了。