全局处理程序调用
global handler invokation
我已经重载了新的函数,但不幸的是,从来没有能够执行全局处理程序请求更多的内存访问我的编译器。我也不理解按照下面的代码片段,如果我们调用全局处理程序请求更多内存如何分配给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。
标题>标题>相关文章:
- 如何从二进制文件中的给定符号中获取调用程序图
- 如何从Clojure调用C++程序,以使程序保持打开状态?
- bash脚本在使用popen()时不返回代码以调用C ++程序
- 从函数调用C++程序?
- 当可以返回错误/异常时,从库中终止调用程序(例如,调用exit())是否总是错误的?
- 是否可以通过另一个程序调用程序
- 使用 Visual Studio 从C++代码调用程序集过程
- 如何从调用程序访问 DLL 的变量?
- 使用可变包类型扩展的C++函数调用程序包装
- Fork()调用-程序从未终止
- 如何在Perl脚本中调用C++程序
- 从 Perl 代码调用C++程序
- C++调用程序中的所有 update() 函数
- DLL 处于调试模式,在发布模式下调用程序(反之亦然)
- 从C++调用程序集代码
- 从C++调用 c 程序并传递参数
- Excel调用C++程序的函数
- 主函数调用程序中的错误标记
- 我可以直接在gdb漂亮的打印机中调用程序的' operator[] '吗?
- 使用从调用程序传递的query或where子句