为什么会出现不断循环的效果?如下代码!
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。
它会不断的调用,直道找到足够的内存。见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 的伪码,你看了就明白了.
你已经设置了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);
}
#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);
}
是这个吧?!?!!?
#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。
它会不断的调用,直道找到足够的内存。见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 的伪码,你看了就明白了.
你已经设置了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);
}
#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);
}
是这个吧?!?!!?
#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);
}
是这个吧?!?!!?