c++ 即使作用域结束[重复],指针还能保持引用吗

yi0zb3m4  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(115)

此问题已在此处有答案

Can a local variable's memory be accessed outside its scope?(20个回答)
5天前关闭。
我很好奇,为什么当“if”范围结束时,“a”即使在“c”之后仍然具有相同的值。

void foo()
{
  int* a = nullptr;
  if (true)
  {
    int b = 1;
    a = &b;
  }
  cout<<a<<endl;
  int c = 2;
  cout<<a<<" "<<*a<<endl;
}
0x7fff3ad69878
0x7fff3ad69878 1

我以为“B”的堆栈空间被释放了,那么下一个var的init会重用地址0x7fff3ad69878?或者这是不可预测的行为,正确的方法是将int b;与“a”放在同一个作用域中?

toiithl6

toiithl61#

我认为重要的是要注意到,预期的行为在这里是未定义的,并且编译器和优化设置中发生的事情是不能指望的,并且是危险的。你可以合理化你的编译器今天正在做的事情,但是明天当你的编译器打补丁时,当你链接不同的代码时,或者当你的操作系统打补丁时,这可能会改变。(这些事情实际上可能不会影响这个特定的行为,但一般来说,这些事情肯定会影响其他“未定义的行为”。
如果您忽略了if (true)可能会或可能不会被优化(并且可能会改变一些事情)的事实,那么b将超出范围。但是编译器可以用多种方式来处理它。编译器可能会把它放在堆栈上,并把它留在那里,这样就有可能 * 但不能保证 * 在一段时间内“未损坏”地引用它。即使c被示例化,编译器也可能会在堆栈上分配新空间,也可能不会。在这种情况下,如果打印出bc的地址,甚至可以看出它们是堆栈区域中相邻的内存空间。但最重要的是要记住,你应该假设编译器被允许 * 对b做任何它想做的事情(包括什么都不做),因为它已经超出了范围。
我不明白你的问题“什么是正确的方式”…你到底想问什么?

相关问题