谁可以解释set_new_handler(new_handler p);这个函数

时间:2022-02-26 20:38:45
这个函数是如何工作的?
为什么会出现不断循环的效果?如下代码!

template<class T>
void* NewHandlerSupport<T>::operator new(size_t size)
{
new_handler globalHandler=::set_new_handler(currentHandler);

void* memory;
try
{
memory=::operator new(size);
}
catch(std::bad_alloc&)
{
::set_new_handler(globalHandler);//<---到这里不是跟着就
throw;                           //重新抛出异常吗? 
}                                         //这么会不断循环来寻求
                                                   //分配足够的内存 
::set_new_handler(globalHandler);
return memory;
}

14 个解决方案

#1


当operator new无法满足内存需求时,它会不只一次的调用new-handler函数,
它会不断的调用,直道找到足够的内存。见Effective C++ (中文版)p27。

#2


感觉上由语言内建实现

#3


我知道书上是这样说,但是,为什么会这样呢?
我要的是原理!

#4


new_handler globalHandler=::set_new_handler(currentHandler);
你已经设置了currentHandler
那么::operator new分配不到内存时就不断的调用curretnHandler函数。
如果currentHandler不抛出异常或不终止程序,那么就不会退出operator new
也就执行不到
catch(std::bad_alloc&)
{
::set_new_handler(globalHandler); throw;                           
}                                                                     
在effective c++ p34 页有operator new 的伪码,你看了就明白了.

#5


感觉上是::operator new来实现循环的,可以试试是否抛出了异常?

#6


set_new_handler是C++中的宏,另外还有一个类似的,忘了,它比较常用,因为它面向自定义处理函数,象你的globalHandler,当你NEW没有分配到所需的内存是,系统转去执行globalHandler,它的原理不难理解,但怎么实现的就不得而知了.

#7


set_new_handler是一个函数,不是宏吧。

#8


果然是我错了,是全局函数,不是宏,这种错误该打.

#9


开始有点明白了!

#10


还有吗?

#11


set_new_handler 是一个callback,如果new失败的时候,系统就会调用这个函数,如果你自己定义了,当然就用你自己定义的了。
   这个给系统恢复提供了最后的方法,不过一般的编程更本用不到这个函数。

#12


给你另一个全局函数的例子:
#include<iostream.h>
#include<stdlib.h>
extern void(*_new_handler)();
void no_memory()
{
cout<<"no merory.";
exit(0);
}
void main()
{
_new_handler=no_memory;
char* p;
do{
p=new char[1000];
if(p)
  cout<<"allcoated 1000.";
}while(p);
}

#13


gz

#14


to: bonoji() (  )
#include<iostream.h>
#include<stdlib.h>
extern void(*_new_handler)();
void no_memory()
{
cout<<"no merory.";
exit(0);
}
void main()
{
_new_handler=no_memory;
char* p;
do{
p=new char[1000];
if(p)
  cout<<"allcoated 1000.";

(*_new_handler)();
}while(!p);
}

是这个吧?!?!!?

#1


当operator new无法满足内存需求时,它会不只一次的调用new-handler函数,
它会不断的调用,直道找到足够的内存。见Effective C++ (中文版)p27。

#2


感觉上由语言内建实现

#3


我知道书上是这样说,但是,为什么会这样呢?
我要的是原理!

#4


new_handler globalHandler=::set_new_handler(currentHandler);
你已经设置了currentHandler
那么::operator new分配不到内存时就不断的调用curretnHandler函数。
如果currentHandler不抛出异常或不终止程序,那么就不会退出operator new
也就执行不到
catch(std::bad_alloc&)
{
::set_new_handler(globalHandler); throw;                           
}                                                                     
在effective c++ p34 页有operator new 的伪码,你看了就明白了.

#5


感觉上是::operator new来实现循环的,可以试试是否抛出了异常?

#6


set_new_handler是C++中的宏,另外还有一个类似的,忘了,它比较常用,因为它面向自定义处理函数,象你的globalHandler,当你NEW没有分配到所需的内存是,系统转去执行globalHandler,它的原理不难理解,但怎么实现的就不得而知了.

#7


set_new_handler是一个函数,不是宏吧。

#8


果然是我错了,是全局函数,不是宏,这种错误该打.

#9


开始有点明白了!

#10


还有吗?

#11


set_new_handler 是一个callback,如果new失败的时候,系统就会调用这个函数,如果你自己定义了,当然就用你自己定义的了。
   这个给系统恢复提供了最后的方法,不过一般的编程更本用不到这个函数。

#12


给你另一个全局函数的例子:
#include<iostream.h>
#include<stdlib.h>
extern void(*_new_handler)();
void no_memory()
{
cout<<"no merory.";
exit(0);
}
void main()
{
_new_handler=no_memory;
char* p;
do{
p=new char[1000];
if(p)
  cout<<"allcoated 1000.";
}while(p);
}

#13


gz

#14


to: bonoji() (  )
#include<iostream.h>
#include<stdlib.h>
extern void(*_new_handler)();
void no_memory()
{
cout<<"no merory.";
exit(0);
}
void main()
{
_new_handler=no_memory;
char* p;
do{
p=new char[1000];
if(p)
  cout<<"allcoated 1000.";

(*_new_handler)();
}while(!p);
}

是这个吧?!?!!?