C++ 针对内存分配失败,在set_new_handler(std::new_handler func)失败后调用构造函数?

C++ 针对内存分配失败,在set_new_handler(std::new_handler func)失败后调用构造函数?,c++,out-of-memory,C++,Out Of Memory,每当我们使用set_new_handler(std::new_handler_mem_alloc)来处理内存分配失败时,如果发生任何内存分配失败,则将调用handle_mem_alloc()。如果我们没有从这个函数内部抛出任何异常,那么新操作符将不会抛出任何错误 我的问题是,在这种情况下,当内存分配失败并且我们没有从handle\u mem\u alloc()函数引发任何异常时,是否会调用构造函数?从中,新处理程序必须执行以下操作之一: 使更多的内存可用 终止程序(例如,通过调用std::ter

每当我们使用set_new_handler(std::new_handler_mem_alloc)来处理内存分配失败时,如果发生任何内存分配失败,则将调用handle_mem_alloc()。如果我们没有从这个函数内部抛出任何异常,那么新操作符将不会抛出任何错误

我的问题是,在这种情况下,当内存分配失败并且我们没有从handle\u mem\u alloc()函数引发任何异常时,是否会调用构造函数?

从中,新处理程序必须执行以下操作之一:

  • 使更多的内存可用
  • 终止程序(例如,通过调用std::terminate)
  • 抛出类型为std::bad_alloc或派生自std::bad_alloc的异常
  • 如果新处理程序返回,则再次尝试分配,如果分配仍然失败,则再次调用新处理程序(未缓存,可能会被新处理程序更改),依此类推

    因此,您的问题的答案是否定的,在内存分配实际成功之前,永远不会调用构造函数。

    从中,新处理程序必须执行以下操作之一:

  • 使更多的内存可用
  • 终止程序(例如,通过调用std::terminate)
  • 抛出类型为std::bad_alloc或派生自std::bad_alloc的异常
  • 如果新处理程序返回,则再次尝试分配,如果分配仍然失败,则再次调用新处理程序(未缓存,可能会被新处理程序更改),依此类推


    因此,您的问题的答案是否定的,在内存分配实际成功之前,永远不会调用构造函数。

    例外情况是任何
    nothrow
    变量,它可以通过返回空指针而无提示地失败。在这种情况下,不会构造任何对象使分配函数抛出<代码> BADYOLLC/<代码>。你好,Kerrek,但是考虑一个我们从构造函数中得到任何异常的情况。在这种情况下,无论如何都会生成异常。。。所以nothrow类型的新操作符将抛出一个异常,因此您应该为捕获该异常进行安全编码,所以使用nothrow的全部目的都是为了抛出。如果我错了,请纠正我。谢谢@Joachim。。。你的回答完全回答了我的问题。我还想听听你对我回复Kerrek的意见。(请为您的同意发表评论)再次感谢..例外情况是任何
    nothrow
    变体,它可以通过返回空指针而无提示地失败。在这种情况下,不会构造任何对象使分配函数抛出<代码> BADYOLLC/<代码>。你好,Kerrek,但是考虑一个我们从构造函数中得到任何异常的情况。在这种情况下,无论如何都会生成异常。。。所以nothrow类型的新操作符将抛出一个异常,因此您应该为捕获该异常进行安全编码,所以使用nothrow的全部目的都是为了抛出。如果我错了,请纠正我。谢谢@Joachim。。。你的回答完全回答了我的问题。我还想听听你对我回复Kerrek的意见。(请评论您的同意)再次感谢。。