主函数执行时C++堆栈溢出异常
C++ stack overflow exception on main function execution
我有下面列出的代码,当我运行它时它会报告堆栈溢出。 我使用按值传递来showTest()
. 我期望的是,它将Test
结构的副本复制到堆栈(推送到堆栈(,然后在函数调用结束时,Test
结构将被释放(从堆栈中弹出(。 所以我打了三次电话。它应该推送到堆栈上并在每次函数调用结束时弹出。
如果每次调用函数时它都会推送并从堆栈中弹出,我没有看到任何堆栈问题。 但是,当我运行此代码时,它会在main
的第一行报告堆栈溢出异常。(我使用Visual Studio 2017。
如果我删除其中一个showTest()
函数调用,那么我就可以让它工作。
任何反馈将不胜感激。
#include <iostream>
struct Test
{
static int Userid;
int data[100000] = { };
Test()
{
++Userid;
};
};
int Test::Userid = 0;
void showTest(Test i_myint)
{
std::cout << "test" << std::endl;
}
int main()
{
Test *pint = new Test();
showTest(*pint);
Test *pint2 = new Test();
showTest(*pint2);
Test *pint3 = new Test();
showTest(*pint3);
return 0;
}
这里显然发生的是延迟堆栈弹出。
在 C 和 C++ 中,常见的调用约定是调用方从堆栈中弹出参数。作为一种常见的优化,许多编译器不会在每次调用后弹出参数,而是在多次调用后执行此操作,并将所有累积的参数一起弹出。这样可以节省一些指令,但代价是更大的堆栈可能会溢出。
在 MSVC 中,禁用优化后,编译器会预先分配并检查堆栈中给定函数中所需的所有调用。这就是为什么程序甚至在打印任何内容之前就崩溃的原因。
查看相应的组件
main
中的一些第一条指令是
mov eax, 1200120 ; 00124ff8H
call __chkstk
sub rsp, rax
这个数字正是在堆栈上容纳对象的三个实例所需要的。
启用优化后,编译器足够智能,可以重用堆栈,因此不会崩溃。
优化装配
mov eax, 400032 ; 00061aa0H
call __chkstk
sub rsp, rax
对于单个实例来说足够了。
相关文章:
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- C++ 对象数组堆栈溢出
- 有没有一种方法可以捕获进程中的堆栈溢出?C++Linux
- 对象接收堆栈溢出异常 c++ 的排序向量
- 将公共递归转换为尾递归,因为大型输入的堆栈溢出
- C++ 中递归期间的堆栈溢出
- 启动 dll 时 C# 环境堆栈溢出
- 在C++中使用数组时如何防止堆栈溢出?
- 如何修复递归函数导致的堆栈溢出错误?C++
- 当我尝试为结构分配新指针时出现堆栈溢出错误
- 为什么析构函数无休止地调用自己(导致堆栈溢出)?
- 为什么堆栈溢出?如有建议,不胜感激
- 主函数执行时C++堆栈溢出异常
- 如何在不导致堆栈溢出的情况下计算非常大的数字和很小的 HCF.我正在使用欧几里得算法
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- 如何在Windows上报告堆栈缓冲区溢出
- 如何抑制来自 gcc 中地址清理器的堆栈缓冲区溢出
- 声明大数组时堆栈/堆溢出
- c++中栈溢出和分段错误的危险