【问题标题】:If variables within a method are temporary. Then why can we access them C++? [duplicate]如果方法中的变量是临时的。那么为什么我们可以访问它们 C++ 呢? [复制]
【发布时间】:2020-03-24 12:09:46
【问题描述】:

你好;
我有一个关于我面临的一个小问题的问题。
如果函数中的变量是临时的。例如:

int* simpleCopy(int *newvalue)
{
   int result;
   int* pointerToResult;
   result = *newvalue;
   pointerToResult = &result;
   return pointerToResult;
}

如果我们尝试使用此功能,它将起作用。但我不明白为什么。


从编译器的角度来看:

该函数将创建一个名为 result 的变量和一个指向该变量的指针。然后将返回指针。 但是当函数完成并返回指针时,变量应该已经消失了它可以工作并给我准确的结果。 谁能给我解释一下原因。
感谢上一页

【问题讨论】:

  • 如果我们尝试使用此功能,它会起作用。 似乎只是这样。不过,它是Undefined BehaviorsimpleCopy()返回的地址不能用于访问内容。
  • 你犯了一个错误。有人告诉你,上面的代码是错误的。这是真的。现在你已经想到了类似this code is an error so it shouldn't work 的东西。那是你的错误。有时有错误的代码仍然有效。这方面的技术术语是未定义的行为。有错误的代码通常具有未定义的行为。 C++ 语言中并没有说糟糕的代码一定会失败。
  • 类比:如果你知道某人住在哪里,那个人死了,他们的房子不会消失,你可能仍然可以进入房子并戳他们的遗体。这并不意味着这个人在常规意义上存在。
  • 谢谢你们真的很有帮助

标签: c++ function methods arguments temporary


【解决方案1】:

谁能给我解释一下原因。

从语言的角度来看:如果您尝试在其生命周期之外访问对象,则程序的行为是未定义的。

假设编译器的观点:您通过指针间接。编译器通常不知道它指向哪里。它只是生成读取值的指令。那段内存可能包含也可能不包含与那里有对象时相同的位。内存可能已用于其他用途,也可能没有。也许内存中包含一些特殊的陷阱表示,会导致 CPU 中断并发出信号。

【讨论】:

    【解决方案2】:

    这是 UB 的事实是正确的回应。人们会对此进行激烈的斗争。甚至说你除了“这是UB”之外什么都不能说

    但这不是一个非常有用的答案。它“wotks”的原因是您的实现使用了堆栈。当您调用simpleCopy 时,它会推送一些额外的内存,包括result 的空间。当您返回时,堆栈被弹出,但内存保持不变。

    由于您没有调用其他函数(实际上是在您调用之前),结果仍然存在。但是你绝对不应该依赖这个。

    原因是优化编译器执行了大量的代码修改。他们这样做是假设您不会尝试访问超出范围的变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多