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

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 a1k=a1[0] 有一个问题,因为代码做了delete [] a2,有效地释放了由指针a2a1 分配和持有的内存(记住它是相同的内存地址),并且在删除之后,它尝试取消引用(通过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。即a1a2指向同一个内存位置。

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

为了帮助理解,请考虑将一杯果汁与两根吸管进行类比。一旦你通过其中一根吸管喝了果汁,就不能再通过另一根吸管喝果汁了。

【讨论】:

【参考方案2】:

a1=a2 行之后,a1a2 都指向同一个内存位置。

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

即使原来的指针被释放了,它也会保存现在失效的数组的地址。将指针放入另一个变量是red herring。

以上是关于为啥这个代码片段说包含错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥代码片段在 matplotlib 2.0.2 上运行良好,但在 matplotlib 2.1.0 上引发错误

viewpager 中的片段,未找到视图错误

为啥这个 CSS 片段可以画一个三角形? [复制]

为啥 recyclerview$adapter 在片段中为空

为啥片段恢复后再次调用onLoadFinished?

java代码在片段活动中不起作用