内存管理:
当new发生错误时,调用set_new_handler()的出错处理函数。
1.set_new_handler机制的运行原理:
<span style="font-size:18px;">#include <iostream>
using namespace std;
void out_of_memory()
{
cout<<"out of memory!"<<endl;
}
int main()
{
set_new_handler(out_of_memory);
int *p = new int[536870911];
return 0;
}</span>
当new发生错误时,调用set_new_handler()的出错处理函数。
2.new的实现以及模拟set_new_handler机制:
new的内部行为分为三步:
1.内存开辟成功;
2.开辟失败,设置有出错函数,则调用出错处理函数;
3.开辟失败,没有设置出错处理函数,则抛出异常。
<span style="font-size:18px;">#include <iostream>
using namespace std;
typedef void (*new_handler)();
class x
{
public:
static new_handler set_new_handler(new_handler p);
static void *operator new[](size_t size);
private:
static new_handler currenthandler;
int data;
};
new_handler x::currenthandler = 0;
new_handler x::set_new_handler(new_handler p)
{
new_handler oldhandler = currenthandler;
currenthandler = p;
return oldhandler;
}
void* x::operator new[](size_t size) //new的内部行为
{
if(size == 0)
{
size = 1;
}
void *result;
while(1)
{
result = malloc(size); //1.开辟成功
if(result != NULL)
return result;
new_handler globalhandler = set_new_hanler(0); //设置出错处理函数
set_new_handler(globalhandler);
if(globalhandler)
(*globalhandler)(); //2.调用出错处理函数
else
throw std::bad_alloc(); //3.抛出异常
}
}
void out_of_memory()
{
cout<<"out of memory!"<<endl;
exit(1);
}
int main()
{
x::set_new_handler(out_of_memory);
try
{
x *px = new x[536870912];
}
catch(bad_alloc &e)
{
cout<<e.what()<<endl;
}
return 0;
}</span>