为何添加std::cout语句会导致指针指向的栈内存值失效?
问题原因分析
核心问题出在栈变量的生命周期与栈内存复用:
- 你在
testfunc_pointer里定义的testscalar是栈上的局部变量,当testfunc_pointer执行完毕返回后,这个变量的生命周期就结束了,它占用的栈内存会被标记为可复用状态,不再受程序的有效管理。 - 没加
std::cout语句时,只是巧合:栈内存还没被后续操作覆盖,所以你通过保存的指针读取到的还是之前残留的123,但这属于未定义行为,不是可靠的结果。 - 加入
std::cout << "testprint" << std::endl;后,cout的执行过程会触发一系列栈操作:- 调用cout的成员函数时,会在栈上创建临时变量、保存寄存器状态、分配新的栈帧;
endl不仅会输出换行,还会触发std::flush操作,底层会调用系统IO相关的函数,这些函数同样会使用栈空间;- 这些操作直接覆盖了之前
testscalar占用的栈内存区域,导致你通过指针读取到的是被覆盖后的随机垃圾值。
简单说:你保存的指针指向的是已经被释放的栈内存,后续任何栈操作都可能修改这块内存的内容,cout只是刚好触发了这种覆盖。
内容的提问来源于stack exchange,提问作者Yes
相关产品推荐
相关产品推荐

