C++返回局部变量地址未崩溃但存在未定义行为的原因咨询
C++返回局部变量地址未崩溃但存在未定义行为的原因咨询
兄弟,你这个问题其实很多刚接触C++的朋友都会碰到,完全能理解你的困惑——明明访问了已经失效的内存,程序却没崩溃还正常输出了,这到底是咋回事?
咱们先拆解下背后的逻辑:
- 函数
foo()里的局部变量a是存在栈内存里的,当foo()执行完毕返回时,对应的栈帧会被标记为「可复用」,但系统并不会立刻清除这块内存里的数据,也不会马上把它回收给操作系统。所以在main()里刚拿到指针p的时候,那块内存里还留着之前的5,你自然能读到正确的值。 - 当你修改
*p = 8时,其实是在修改那块已经被标记为可复用的栈内存,但因为这时候还没有其他函数调用过来覆盖这块内存区域,所以修改后的值也能正常读出来。
但这里必须敲黑板强调:这完全是未定义行为(Undefined Behavior)!C++标准根本没有规定这种情况下程序必须崩溃或者输出垃圾值。它可能今天正常运行,明天换个编译器、开个优化选项(比如-O2)、或者在代码里多调用一个其他函数,就会突然崩溃、输出奇怪的结果,甚至出现更诡异的行为——比如程序逻辑莫名出错,但表面上看不出任何问题。
举个例子,你要是在int* p = foo();之后加一行printf("随便打印点啥\n");,再去访问*p,很大概率就得不到5了,因为刚才的printf调用已经覆盖了那块栈内存。
所以千万不要依赖这种“侥幸”的正常运行!正确的做法是绝对不要返回局部变量的地址,如果需要返回动态分配的内存,可以用new(记得后续用delete释放),或者直接返回变量的值,也可以用std::unique_ptr这类智能指针来自动管理内存,避免出现这种危险的未定义行为。
内容来源于stack exchange
相关产品推荐
相关产品推荐

