您的位置:首页 > 编程语言 > C语言/C++

new,关于effectivec++20页内容来个总结1

2016-04-21 09:37 453 查看
关于new_handler,绝对是陌生的,想起之前放弃的MFC中的句柄的概念,觉得差不多,就是操作的new的一种工具,而那个句柄就是一个int,这个就是一个函数指针

主意:c++不支持定义自己的new_handler,其实也没有必要,因为完全可以通过set_new_handler

typedef void (*new_handler)();//new_handler


与之关系密切的 set_new_handler,他总是指向new分配失败时的那个函数,返回一个new_handler

new_handler set_new_handler (new_handler);


用以更新 new_handler

#include <iostream>
#include <new>

void  outofMem()//书上一例子
{
std::cerr<< "out of memory" << std::endl;
abort();
}
int main(){
std::set_new_handler(outofMem());
int* bigArray = new int[1000000000L];

return 0;
}


operator new 的伪码:
void* operator new (std::size_t size)throw(std::bad_alloc)
{
if(size == 0)
size = 1;
while(true)
if(成功分配)
return(one pointer to a memory)
else
std::new_handler golbal handler =
std::set_new_handler(0);//卸载
std::set_new_handler(std::new_handler);//安装
if(golbalHandler)(*golbalHandler)();
//觉得跟if(!p)差不多
else
throw std::bad_alloc();
}


new_handler 只是一个类型,记住,太容易骗人了。

我们没办法获得一个new_handler,只能通过std::set_new_handler来取得,其实在意义就是你写一个差错处理程序,当你想在new循环中换另一个程序来处理,这时你应该使用std::set_new_handler,只有他能帮助你取得下一个程序的指针。

认识了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: