当前位置: 首页 > 知识库问答 >
问题:

set _ new _ handler(STD::new _ handler func)失败后的构造函数调用,针对内存分配失败?

孟文栋
2023-03-14

每当我们使用set_new_handler(std::new_ handler handle_mem_alloc)来处理内存分配失败时,如果发生任何内存分配失败,则将调用handle _mem_alloc()。如果我们没有从该函数内部引发任何异常,则新运算符将不会引发任何错误。

我的问题是,当内存分配失败并且我们没有从handle_mem_alloc()函数抛出任何异常时,在这种情况下会调用构造函数吗?

共有1个答案

宋子辰
2023-03-14

根据该引用,新的处理程序必须执行以下操作之一:

  1. 使更多的可用存储器
  2. 终止程序(例如通过调用std::终止)
  3. 抛出类型为std::bad_alloc或源自std::bad_alloc的异常。

如果新的处理程序返回,则再次尝试分配,如果它仍然失败,则再次调用新的处理程序(未缓存,并且可能被新处理程序更改),依此类推。

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

 类似资料:
  • 编辑:需要知道如何创建由Textview填充的

  • 本文向大家介绍C++ 内存分配处理函数set_new_handler的使用,包括了C++ 内存分配处理函数set_new_handler的使用的使用技巧和注意事项,需要的朋友参考一下 一、函数的定义 函数在namespace std中有如下定义(C++98与C++11版本不一致): 二、函数介绍 该函数的作用是:当new操作或new[]操作失败时调用参数所指的new_p函数 异常安全: C++98

  • 问题内容: 我有以下表格- 对于这些表,关联的Dao和DaoImpl如下 数据库助手如下: 现在,当我尝试致电- 它错误并显示以下错误: 现在,如果我在A中没有foreign键-即如果A不包含 公共B b ,那么它可以正常工作。我在这里缺少什么吗? 提前非常感谢您。 问题答案: 我怀疑在异常堆栈跟踪的末尾有您丢失的原因消息。例如,如果我在上面重复了您的示例,则会得到: 因为有一个class的外部字

  • 在下面的C++代码中,在析构函数调用期间,它会崩溃,并出现以下错误。 如果打印了这条消息,至少程序还没有崩溃!但您可能还想打印其他诊断消息。DSCodes(16782,0x1000EFE00)malloc:***对象0x10742E2F0错误:未分配释放的指针DSCodes(16782,0x1000EFE00)malloc:***在malloc_error_break中设置断点以调试 有人能告诉我

  • 使用Visual Studio 2015(更新3)时,我在一个更大的项目中遇到了一个问题,我将其归结为下面的最小示例。 其中我有一个包含std::string[3]的类测试。测试的构造函数可能会抛出一个异常,我想在顶层(main)处理这个异常。然而,当从构造函数抛出时,xmemory中的断言失败了——在我看来,这似乎是在尝试释放和释放std::string[3]时发生的(请参阅下面的控制台输出和堆