当一个类在构造函数处动态分配自己时,为什么会发生堆栈溢出而不是 std::bad_alloc
When a class dynamically allocates itself at constructor, why does stack overflow happen instead of std::bad_alloc?
我创建了一个使用new
递归创建自己的类(只是为了好玩!(,期望这会由于无限动态分配(堆溢出(而引发std::bad_alloc
。但是堆栈溢出发生了,而不是std::bad_alloc
.为什么会这样?
class Overflow
{
private:
Overflow* overflow;
public:
Overflow()
{
overflow = new Overflow();
}
};
int main()
{
Overflow overflow_happens; // stack overflow happens instead of std::bad_alloc exeption
}
@Caleth问如果我将新的Overflow((更改为新的Overflow[100000]会发生什么,这给了我std::bad_alloc
。根据答案,这不应该也给我堆栈溢出吗?
堆栈溢出正在发生,因为您有无限递归。 呼叫Overflow()
会导致您一次又一次地呼叫Overflow()
。 这些函数调用需要在堆栈上进行。 由于您的堆栈小于堆,因此在要创建的所有对象的内存不足之前,您将耗尽所有这些构造函数调用的堆栈空间。
因为你要递归地反复调用构造函数,一个方法。方法调用被推送到调用堆栈。由于堆栈大小远小于可用堆,因此调用堆栈会在堆用完之前溢出。
我对你的代码做了一个小的修改:
#include <array>
template <size_t size>
class Overflow
{
private:
Overflow* overflow;
std::array<int,size> x;
public:
Overflow()
{
overflow = new Overflow();
}
};
在魔杖盒上这个
int main()
{
Overflow<1> overflow_happens;
}
导致堆栈溢出导致的分段错误。
然而,这
int main()
{
Overflow<10000> bad_alloc;
}
结果在
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted
你在这里基本上有两个相互竞争的效果。作为第一个近似值(细节涉及更多(,对于构造体的每个递归,您都有:
- 堆栈上的
Overflow*
- 堆上的整个
Overflow
实例
因此,您是首先获得堆栈溢出还是bad_alloc
取决于Overflow
的大小。对于较小的大小,您将首先获得溢出,因为堆栈空间比堆空间有限得多。
PS:我错过了你的编辑......如果你把new Overflow[100000]
放在代码的构造函数中,你会放大所需的堆空间,就像我通过添加array
成员所做的那样。在堆栈上,您仍然只有一个指针,因此您更早地用完了堆。
相关文章:
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- C++ 对象数组堆栈溢出
- 有没有一种方法可以捕获进程中的堆栈溢出?C++Linux
- 对象接收堆栈溢出异常 c++ 的排序向量
- 将公共递归转换为尾递归,因为大型输入的堆栈溢出
- C++ 中递归期间的堆栈溢出
- 启动 dll 时 C# 环境堆栈溢出
- 在C++中使用数组时如何防止堆栈溢出?
- 如何修复递归函数导致的堆栈溢出错误?C++
- 当我尝试为结构分配新指针时出现堆栈溢出错误
- 为什么析构函数无休止地调用自己(导致堆栈溢出)?
- 为什么堆栈溢出?如有建议,不胜感激
- 主函数执行时C++堆栈溢出异常
- 如何在不导致堆栈溢出的情况下计算非常大的数字和很小的 HCF.我正在使用欧几里得算法
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- 如何在Windows上报告堆栈缓冲区溢出
- 如何抑制来自 gcc 中地址清理器的堆栈缓冲区溢出
- 声明大数组时堆栈/堆溢出
- c++中栈溢出和分段错误的危险