全局处理程序调用

global handler invokation

本文关键字:调用 程序 处理 全局      更新时间:2023-10-16

我已经重载了新的函数,但不幸的是,从来没有能够执行全局处理程序请求更多的内存访问我的编译器。我也不理解按照下面的代码片段,如果我们调用全局处理程序请求更多内存如何分配给p

如果有人能给我解释一下,我很感激

void * Pool:: operator new ( size_t size ) throw( const char *)
{
    int n=0;
    while(1)
    {
        void *p = malloc (100000000L);
        if(p==0)
        {
            new_handler ghd= set_new_handler(0);//deinstall curent handler
            set_new_handler(ghd);// install global handler for more memory access
            if(ghd)
                (*ghd)();
            else 
                throw "out of memory exception";
        }
        else
        {
            return p;
        }
    }
}

要产生任何效果,程序的其他部分必须先前安装了全局处理程序。该处理程序还必须在调用处理程序时释放某种内存(可能是一些可以丢弃的缓冲区或缓存)。

默认的new_handler只是一个空指针,所以你的代码很可能最终抛出一个异常。

此外,我还会抛出一个bad_alloc异常,以与其他operator new重载保持一致。

这里有两件事要讨论,第一个是使用new_handler,第二个是重载操作符new

<标题> set_new_handler ()

当您想要使用new_handler时,您必须注册它。这通常是输入main()后要做的第一件事。处理程序也应该由您提供。

#include <iostream>
#include <new>
void noMemory() throw()
{
  std::cout << "no memory" << std::endl;
  exit(-1);
}
int main()
{
  set_new_handler(noMemory);
  // this will probably fail and noMemory() will be called
  char *c = new char[100000000L];
  std::cout << "end" << std::endl;
}

当没有内存可以分配时,您注册的处理程序将被调用,并且您有机会释放一些内存。当处理程序返回时,操作符new将再次尝试分配您请求的内存量。

<标题> p>默认操作符new的结构与您介绍的类似。从new_handler的角度来看,重要的部分是while(1)循环,因为它负责在调用new_handler之后尝试获取内存。while(1)循环有两种方法:
  • 获取有效指针
  • 抛出异常

当你提供new_handler时,你必须记住这一点,因为如果你不能做任何事情来释放内存,你应该卸载处理程序(或终止或抛出异常),否则你会陷入一个无尽的循环。

我猜在你的代码中省略参数大小只是为了测试的目的。

参见Scott Meyers的Effective c++ Item 7。由于new操作符必须返回一个有效的指针,即使参数size = 0,在操作符new中要做的第一件事应该是在用户想要分配0字节数的情况下将size覆盖为1。