【问题标题】: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

标签: c++ pointers delete-operator assignment-operator


【解决方案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
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多