捕获内存分配异常

时间:2013-07-31 06:33:49

标签: c++ exception-handling

void newHandler() {
   cdebug << "memory allocation failure" << std::endl;
   throw std::bad_alloc();
}

int main() {
  std::set_new_handler(newHandler);
  // ...
}
  

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

我对上面文本的问题是“在内存分配成功或函数抛出错误之前,authore的意思是什么”。在这种情况下,函数如何抛出错误?请以示例来理解。

感谢您的时间和帮助。

2 个答案:

答案 0 :(得分:7)

基本上,您的处理程序可能有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);

答案 1 :(得分:0)

意图是处理程序可以释放一些内存,返回,然后new()可以重试分配。只要分配失败,new()就会调用处理程序。处理程序可以通过抛出bad_alloc()来中止这些尝试,实质上是说'我不能再释放任何内存,所以分配不能超过'。

此处有更多详情:

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