C++ 捕捉内存分配的异常 void newHandler(){ cdebug

C++ 捕捉内存分配的异常 void newHandler(){ cdebug,c++,exception-handling,C++,Exception Handling,基本上,您的处理程序可能有3种行为 它抛出一个坏的\u alloc(或其派生类) 它调用exit或abord函数来停止程序执行 它返回,在这种情况下,将发生新的分配尝试 参考文献: 如果您不想在每次新呼叫时处理分配错误,这将非常有用。 例如,根据您的系统(使用大量内存),您可以释放一些分配的内存(缓存),以便下次尝试内存分配时能够成功 void newHandler() { cdebug << "memory allocation failure" << std

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

  • 它抛出一个坏的\u alloc(或其派生类)
  • 它调用exit或abord函数来停止程序执行
  • 它返回,在这种情况下,将发生新的分配尝试
参考文献:

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

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

int main() {
  std::set_new_handler(newHandler);
  // ...
}
void no_内存()
{
if(缓存的_data.exist())
{

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

详情如下:


可能重复@Loki的问题:这是一个比你发布的可能重复的问题更具体的问题。但我认为标题应该改为:如何使用std::set_new_处理程序“发送预期”应该是“抛出异常”
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);