我创建了一个使用 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 询问如果我将 new Overflow() 更改为 new Overflow[100000] 会发生什么,这给了我 std::bad_alloc
。根据答案,这不应该也给我堆栈溢出吗?
最佳答案
发生堆栈溢出是因为您有无限递归。调用 Overflow()
会导致你一次又一次地调用 Overflow()
。这些函数调用需要进入堆栈。由于您的堆栈小于堆,因此在您创建的所有对象的内存不足之前,您将耗尽所有这些构造函数调用的堆栈空间。
关于c++ - 当一个类在构造函数中动态分配自己时,为什么会发生堆栈溢出而不是 std::bad_alloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56545469/