捕获内存分配的异常

catching exception for memory allocation

本文关键字:异常 分配 内存      更新时间:2023-10-16
void newHandler() {
   cdebug << "memory allocation failure" << std::endl;
   throw std::bad_alloc();
}
int main() {
  std::set_new_handler(newHandler);
  // ...
}

一旦 newHandler 被建立为我们的错误处理程序,它将被调用 当任何堆分配失败时。关于错误的有趣之处 处理程序是它将连续调用,直到内存 分配成功,或者函数引发错误。

我对上述文本的问题是 authore 所说的"直到内存分配成功或函数抛出错误"是什么意思。在这种情况下,函数如何抛出错误?要求举例了解。

感谢您的时间和帮助。

基本上,您的处理程序可能有 3 种行为

  • 它抛出一个bad_alloc(或其派生类(。
  • 它调用停止程序执行的退出或 abord 函数
  • 它返回,在这种情况下,将发生新的分配尝试

参考: http://www.cplusplus.com/reference/new/set_new_handler/

如果您不想处理每个新呼叫上的分配错误,这将非常有用。根据您的系统(使用大量内存(,例如,您可以释放一些分配的内存(缓存(,以便下一次尝试内存分配可以成功。

void no_memory ()
{
  if(cached_data.exist())
  {
    std::cout << "Free cache memory so the allocation can succeed!n";
    cached_data.remove();
  }
  else
  {
    std::cout << "Failed to allocate memory!n";
    std::exit (1); // Or throw an expection...
  }
}
std::set_new_handler(no_memory);

目的是处理程序可以释放一些内存,返回,然后 new(( 可以重试分配。 new(( 将调用处理程序,只要分配一直失败。处理程序可以通过抛出 bad_alloc(( 来中止这些尝试,本质上是说"我无法释放更多内存,因此分配无法成功"。

更多细节在这里:

http://www.cplusplus.com/reference/new/set_new_handler/