脚本宝典收集整理的这篇文章主要介绍了【读书笔记】Effective C++(08)定制new和delete,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
作者:LOGM
本文原载于 https://segmentfault.com/u/logm/articles,不允许转载~
8. 定制new和delete
-
8.1 条款49:了解new-handler的行为
- new-handler相当于new的异常处理函数。new申请内存发生异常,调用new-handler处理,处理完了之后继续尝试new,如果还是出错,继续调用new-handler,以此反复。
//标准库对于new-handler是这么写的:
//new_handler被定义成一个函数指针
//set_new_handler函数的参数是个指针,指向new无法分配足够内存时应该调用的函数;
//set_new_handler函数的返回值是个指针,指向set_new_handler之前设置的new_handler函数
namespace std {
typedef void (*new_handler)();
new_handler set_new_handler(new_handler p) throw();
}
//可以这样使用set_new_handler
void oufOfMem()
{
std::cerr << "Unalbe to newn";
std::abort();
}
int main()
{
std::set_new_handler(outOfMem);
int * pBigArray = new int[10000000000L];
}
-
一般来说,new-handler函数会做以下事情的某几件:
- a. 让更多内存可被使用。使得再次尝试new能成功。
- b. 安装另一个new-handler。使用更强力的new-handler处理。
- c. 卸载new-handler。实在不行,卸载new-handler使new抛出异常。
- d. 抛出bad_alloc的异常。
- e. 退出程序。abort()或exIT()。
-
8.2 条款50:了解new和delete的合理替换时机
-
8.3 条款51:编写new和delete时需要固守常规
-
8.4 条款52:写了placement new也要写placement delete
Widget* pw = new Widget
//这句话中总共有2个函数被调用:1.operator new分配内存;2.Widget的构造函数
//当调用Widget构造函数发生异常时,需要delete掉第一步new出来的内存
//如果使用C++自带的new和delete,这个情况不需要用户考虑;如果是自定义new和delete,需要用户考虑
以上是脚本宝典为你收集整理的【读书笔记】Effective C++(08)定制new和delete全部内容,希望文章能够帮你解决【读书笔记】Effective C++(08)定制new和delete所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。