zoukankan      html  css  js  c++  java
  • Effective C++学习笔记(八)

    定制new和delete

    条款四十九 了解ner_handler的行为

    • new_handler是一个typedef,定义出一个指针指向函数,该函数没有参数,也不返回任何东西。

    • set_new_handler的参数一个指针,指向operator new无法分配足够内存时需要被调用的函数,。返回值也是个指针,指向set_new_handler被调用前正在执行的那个new_handler函数。

      在这个例子中,当 operator new 无法为5000000000个整数分配足够空间的时候,oom() 函数会被调用,程序输出 “out of memory!!” 后夭折,如果在写出错误信息到 cerr 的过程中必须动态分配内存,则会进入上一篇中提到的 oom_malloc() 函数中的死循环,不断尝试释放、再配置、再释放、再配置......

      void oom()
      {
      	cerr << "out of memory!!";
      	about();
      }
      
      int main()
      {
      	set_new_handler(oom);
      	int *needBigMemory = new int [5000000000L];
      	...
      	return 0;
      }
      

      当 operator new 无法满足内存申请时,它会不断调用“new-handler”函数(也就是不停在oom_malloc()函数中死循环),直到找到足够内存。由此我们必须设计良好的 new-handler 函数。具体如下:

      1、让更多内存可被使用,这边造成了operator new内的下一次内存分配动作可能成功。实现此策略的一个做法是,程序一开始执行就分配一大块内存,而后当 new-handler 第一次被调用,将它们释还给程序使用。

      2、安装另一个 new-handler。如果目前这个 new-handler 无法取得更多可用内存,或许它知道另外哪个 new-handle 有此能力。如此,目前这个new-handler 就可以安装另外那个 new-handler 以替换自己。下次当operator new 调用 new-handler,调用的将是最新安装的那个。(如果 new-handler 修改自己的行为,于是当它下次被调用,就会做某些不同的事。为达此目的,做法之一是令 new-handler 修改“会影响new-handler 行为”的static数据、namespace数据或global数据)

      3、卸除 new-handler,也就是将null指针传给 set_new_handler。一旦没有安装任何 new-handler, operator new 会在内存分配不成功时抛出异常。

      4、抛出 bad_alloc (或派生自 bad_alloc) 的异常。这样的异常不会被operator new 捕捉,因此会被传播到内存索求处。

      5、不返回,通常调用 abort() 或 exit(0)。

    条款五十 了解new和delete的合理替换时机

    • 什么时候适合重载new和delete

    条款五十一 编写new和delete时需遵循常规

    条款五十二 写了placement new , 也要写placement delete

    杂项讨论

    条款五十三 不要轻视编译器的警告

    • 严肃对待编译器发出的警告信息。努力在你的饿扁一起的最高警告级别下争取无任何警告的荣誉
    • 不要过度依赖编译器的报警能力,因为不同编译器对待事物的态度并不相同。一旦移植到另一个编译器上,你原本依赖的警告信息有可能消失。

    条款五十四 让自己熟悉包括TR1在内的标准程序库

    条款五十四 让自己熟悉Boost

  • 相关阅读:
    bzoj 1689: [Usaco2005 Open] Muddy roads 泥泞的路【贪心】
    bzoj 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛【二分+贪心】
    bzoj 3401: [Usaco2009 Mar]Look Up 仰望【单调栈】
    bzoj 1652: [Usaco2006 Feb]Treats for the Cows【区间dp】
    bzoj 1718: [Usaco2006 Jan] Redundant Paths 分离的路径【tarjan】
    bzoj 1655: [Usaco2006 Jan] Dollar Dayz 奶牛商店【高精度+完全背包】
    洛谷 P3121 [USACO15FEB]审查(黄金)Censoring (Gold) 【AC自动机+栈】
    bzoj 3942: [Usaco2015 Feb]Censoring【kmp+栈】
    bzoj 1578: [Usaco2009 Feb]Stock Market 股票市场【背包】
    性能优化一大推
  • 原文地址:https://www.cnblogs.com/whutao/p/10869759.html
Copyright © 2011-2022 走看看