我已经重载了新函数,但遗憾的是从来没有能够执行全局处理程序来请求在我的编译器上进行更多的内存访问。如果我们调用的话,我也不理解下面的代码片段 请求更多内存的全局处理程序如何将其分配给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;
}
}
}
答案 0 :(得分:0)
要产生任何效果,程序的其他部分必须先安装一个全局处理程序。调用处理程序时,该处理程序还必须具有某种内存(可能是一些可以丢弃的缓冲区或缓存)。
默认的new_handler只是一个空指针,所以你的代码最终可能会抛出异常。
另外,我会抛出一个bad_alloc
异常以与其他operator new
重载保持一致。
答案 1 :(得分:0)
以下是要讨论的两件事,第一件是使用 new_handler ,第二件是重载 operator new 。
如果您想使用 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;
}
如果无法分配内存,则会调用已注册的处理程序,并且您有机会释放一些内存。当处理程序返回时, operator new 将再次尝试分配您请求的内存量。
默认运算符new 的结构与您提供的内容类似。从 new_handler 开始,重要的部分是 while(1)循环,因为它在调用 new_handler
这个有两种方法,而(1)循环:
当你提供 new_handler 时,你必须记住这一点,因为如果你不能做任何事情来释放内存你应该卸载处理程序(或终止或抛出异常),否则你可以陷入无休止的循环中。
我想在代码中省略参数大小仅用于测试目的。
有关详细信息,另请参阅 Scott Meyers的Effective C ++ Item 7 。由于operator new必须返回一个有效的指针,即使参数size = 0,在 operator new 中要做的第一件事应该是在用户想要分配0个字节的情况下将大小覆盖为1。这个技巧简单而且相当有效。