c++ - 当一个类在构造函数中动态分配自己时,为什么会发生堆栈溢出而不是 std::bad_alloc?

标签 c++ stack-overflow 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 询问如果我将 new Overflow() 更改为 new Overflow[100000] 会发生什么,这给了我 std::bad_alloc。根据答案,这不应该也给我堆栈溢出吗?

最佳答案

发生堆栈溢出是因为您有无限递归。调用 Overflow() 会导致你一次又一次地调用 Overflow()。这些函数调用需要进入堆栈。由于您的堆栈小于堆,因此在您创建的所有对象的内存不足之前,您将耗尽所有这些构造函数调用的堆栈空间。

关于c++ - 当一个类在构造函数中动态分配自己时,为什么会发生堆栈溢出而不是 std::bad_alloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56545469/

相关文章:

java - 为什么我的递归没有返回但最终导致堆栈溢出?

c++ - 即使我有超过10GB的可用内存,使用C++读取大型(〜1GB)数据文件有时也会抛出bad_alloc

c++ - 尝试初始化矩阵 C++ 时分配错误

c++ - 如何处理 C++ 中的 bad_alloc?

c++ - 什么时候堆内存优先于堆栈内存

c++ - glGetTexImage 使用 FBO 返回 0

c++ - 添加 "reference"指向静态库项目 : still need to include directory

c++ - 如何阻止 GL_Points 删除 GL_line_loop 创建的线

c++ - 在 QString 中推送 QChar

c - 关于调用自身的函数的堆栈重用?