局部变量的返回地址和程序仍然有效
Returning address of local variable and program still work
假设这是我想要谈论的快照。在这段代码中,main函数调用'foo',返回局部声明变量'a'的地址。在我的印象中,局部声明的变量在超出作用域时将重新分配内存。变量'a'应该在调用foo之后取消分配,并且不应该留下任何与'a'相关的内容。但在这种情况下,它似乎打破了这个基本假设。下面发生了什么?
int* foo() {
int a = 5;
return &a;
}
int main() {
int* p = foo();
// Prints 5
std::cout << "Coming from foo = " << *p << std::endl;
*p = 8;
// Prints 8
std::cout << "Setting explicitly = " << *p << std::endl;
}
您的代码调用未定义行为。虽然它的名字很贴切,但它没有定义,这意味着您可能会得到预期的结果,也可能不会。你应该做的是不要依赖这样的结果,因为它们没有定义好。你可能会因为得到预期的结果而感到幸运,但相信我,这是一个陷阱!
这取决于你的机器/编译器打印什么值。堆栈的释放并不意味着之前在那里的东西被删除了。这就意味着这块区域已经失效了。这意味着当您尝试访问这些地址时,行为不能得到保证。在您的示例中,用于存储局部变量a
的位置没有被覆盖。
相关文章:
- C++程序在将 int 与 cin 一起使用时有效,但不能使用字符串
- C++,在对象内分配多个数据时,堆栈分配是否更有效? 在下面的程序中,类A_Heap的效率会更低吗?
- SWIG和Mingw-64与Python一起使用...不是有效的 Win32 应用程序
- 当程序从该函数调谐器时,指向在函数中声明和定义的某些 C 字符串的指针不再有效.为什么?
- 程序'main.exe'运行失败:指定的可执行文件不是此操作系统平台的有效应用程序
- 一个创建彩票游戏的程序,该彩票游戏可以有效地创建 10 套而没有任何重复?
- 用于在程序结束后暂停程序的有效循环
- boost::asio 使用 post() 时没有调用处理程序,当直接调用函数时有效(io_context有工作)
- 为什么这个带有 mov 算术的有效程序集在使用本地变量时无法编译
- 程序在C++ Tutor中执行时有效,但在其他任何地方都不起作用
- 程序有效,但在 20-30 秒后随机关闭
- 更有效的方法来制作数字记忆程序
- LoadLibrary失败带有错误4250:此操作仅在应用程序容器的上下文中有效
- 如何有效地构建QT应用程序
- 当从一个应用程序调用时,在DLL方法中创建COM接口指针是有效的,但当从另一个应用软件调用时则无效
- 创建 COM 接口指针在开发计算机上有效,但会导致其他计算机上的应用程序崩溃
- Exe不是有效的win32应用程序,但在64位上运行
- 如何在程序崩溃后释放managedsharedmemory:在调试过程中使用哪些有效的技术
- 合并排序程序总是有效的,但有时会在最后说中止陷阱
- Visual Studio 2013 *.exe不是有效的Win32应用程序