为什么说这个代码片段包含错误?
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
之后,a1
和a2
都指向相同的内存位置。
那么当你运行delete a2[]
时,a2
指向的内存就被释放了。而且由于a1
和a2
指向同一个内存位置,所以a1
也是无效的。
然后当您取消引用 a1
时,它指向释放的内存,您调用 undefine behavior.
它使 a1
与 a2
具有相同的值。由于 a2
是指向动态分配数组的指针,所以它是 a1
。当您释放与该数组关联的内存时,就会出现问题。 a1
仍然保存着现在不存在的数组的地址,并且很可能所有涉及取消引用 a1
的操作,例如 k=a1[0]
将导致非法内存访问。
a1=a2 //What does this line mean???
=
就是assignment operator。这实际上是将 LHS 操作数的值赋给 RHS 操作数。
这里,这一行的意思是,将a2
的值赋值给a1
,即把a2
指针赋值给a1
。即a1
和a2
指向同一个内存位置。
现在,一旦您用 a1
调用 delete[]
,它实际上释放了内存。然后,访问 a1[i]
或 a2[i]
是相同的,访问已经释放的内存调用 undefined behavior.
为了帮助理解,请考虑将两根吸管放入一杯果汁的类比。一旦你用一根吸管喝完果汁,你就不能再用另一根吸管喝果汁了。
我通常知道,* 和 & 标志。但是我们的老师给了我们一个例子,她说 "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
之后,a1
和a2
都指向相同的内存位置。
那么当你运行delete a2[]
时,a2
指向的内存就被释放了。而且由于a1
和a2
指向同一个内存位置,所以a1
也是无效的。
然后当您取消引用 a1
时,它指向释放的内存,您调用 undefine behavior.
它使 a1
与 a2
具有相同的值。由于 a2
是指向动态分配数组的指针,所以它是 a1
。当您释放与该数组关联的内存时,就会出现问题。 a1
仍然保存着现在不存在的数组的地址,并且很可能所有涉及取消引用 a1
的操作,例如 k=a1[0]
将导致非法内存访问。
a1=a2 //What does this line mean???
=
就是assignment operator。这实际上是将 LHS 操作数的值赋给 RHS 操作数。
这里,这一行的意思是,将a2
的值赋值给a1
,即把a2
指针赋值给a1
。即a1
和a2
指向同一个内存位置。
现在,一旦您用 a1
调用 delete[]
,它实际上释放了内存。然后,访问 a1[i]
或 a2[i]
是相同的,访问已经释放的内存调用 undefined behavior.
为了帮助理解,请考虑将两根吸管放入一杯果汁的类比。一旦你用一根吸管喝完果汁,你就不能再用另一根吸管喝果汁了。