为啥这个代码片段说包含错误?
Posted
技术标签:
【中文标题】为啥这个代码片段说包含错误?【英文标题】:Why this code snippet said to contain error?为什么这个代码片段说包含错误? 【发布时间】:2016-09-23 10:50:29 【问题描述】:我通常知道 * 和 & 符号。但是我们的老师给我们举了一个例子,她说“这里出现问题”
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 ? 为什么会出现错误?
【问题讨论】:
delete
不是 C。似乎是 C++。编辑:@GürkanÇatak 你应该通过参加课程/课程来了解语言(我猜)。
这不是我自己的例子或问题。她的例子。
a1=a2
表示Copy the address stored in a2 to a1
。 k=a1[0]
有一个问题,因为代码做了delete [] a2
,有效地释放了由指针a2
和a1
分配和持有的内存(记住它是相同的内存地址),并且在删除之后,它尝试取消引用(通过a1
访问)它,这可能会导致崩溃。指向已释放内存区域的指针称为悬空指针。
在语句末尾添加;
不是避免编译错误吗?
"我不明白什么是 a1 = a2 ?为什么会出现错误?" --> "//she said error occurs here.
": “k=a1[0]
”,不存在“a1=a2
”
【参考方案1】:
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 的已释放内存。
为了帮助理解,请考虑将一杯果汁与两根吸管进行类比。一旦你通过其中一根吸管喝了果汁,就不能再通过另一根吸管喝果汁了。
【讨论】:
【参考方案2】:在a1=a2
行之后,a1
和a2
都指向同一个内存位置。
然后当你运行delete a2[]
时,a2
指向的内存被释放。而且由于a1
和a2
指向同一个内存位置,所以a1
也是无效的。
然后,当您取消引用指向已释放内存的 a1
时,您将调用 undefine behavior。
【讨论】:
【参考方案3】:它使a1
与a2
具有相同的值。因为a2
是一个指向动态分配数组的指针,所以它是a1
。当您释放与该数组关联的内存时,就会出现问题。 a1
仍然保存着现已失效的数组的地址,而且很可能所有涉及取消引用 a1
的操作,例如 k=a1[0]
都会导致非法内存访问。
【讨论】:
即使原来的指针被释放了,它也会保存现在失效的数组的地址。将指针放入另一个变量是red herring。以上是关于为啥这个代码片段说包含错误?的主要内容,如果未能解决你的问题,请参考以下文章
为啥代码片段在 matplotlib 2.0.2 上运行良好,但在 matplotlib 2.1.0 上引发错误