Effective C++(八)定制new和delete

定制new和delete

STL容器所使用的heap内存是由容器所拥有的分配器对象(allocator ojects)管理,不是被new和delete直接管理。

  1. 条款49:了解new-handler的行为

    • 请记住:
      • set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用
      • Nothrow new是一个颇为局限的工具,因为它只适用于内存分配;后继的构造函数调用还是可能抛出异常
      • 当operator new无法满足某一内存分配需求时,它会抛出异常。以前它会返回一个null指针。当operator new抛出异常以反映一个未获满足的内存需求之前,它会先调用一个客户指定的错误处理函数,一个所谓的new-handler。为了指定这个“用以处理内存不足”的函数,客户必须调用set_new_handler,那是声明于<new>的一个标准程序库函数
  2. 条款50:了解new和delete的合理替换时机

    • 请记住:有很多理由需要写个自定的new和delete,包括改善效能、对heap运用错误进行调试、收集heap使用信息
  3. 条款51:编写new和delete时需固守常规
    • 请记住:
      • operator new应该包含一个无穷循环,并在其中尝试分配内存,如果它无法满足内存需求,就该调用new-handler。它也应该有能力处理0 bytes申请。Class专属版本则还应该处理“比正确大小更大的(错误)申请”
      • operater delete应该在收到null指针时不做任何事。Class专属版本则还应该处理“比正确大小更大的(错误)申请”
  4. 条款52:写了placement new也要写placement delete
    • 请记住:
      • 当你写一个placement operator new,请确定也写出了对应的placement operator delete。如果没有这样做,你的程序可能会发生隐微而时断时续的内存泄露
      • 当你声明placement new和placement delete,请确定不要无意识地遮掩了它们的正常版本

杂项讨论

  1. 条款53:不要轻忽编译器的警告

    • 请记住:
      • 严肃对待编译器发出的警告信息。努力在你的编译器的最高经高级别下争取“无任何警告”的荣誉
      • 不要过度倚赖编译器的报警能力,因为不同的编译器对待事物的态度并不相同。一旦移植到另一个编译器上,你原本倚赖的警告信息有可能消失
  2. 条款54:让自己熟悉包括TR1在内的标准程序库

    • 请记住:
      • C++标准程序库的主要技能由STL、iostream、locals组成。并包含C99标准程序库
      • TR1添加了智能指针、一般化函数指针、hash-based容器、正则表达式以及另外10个组件的支持
      • TR1自身只是一份规范。为获得TR1的好处,你需要一份实物。一个好的实物来源于Boost
  3. 条款55:让自己熟悉Boost

    • 请记住:
      • Boost是一个社群,也是一个网站。致力于免费、源码开放、同僚复审的C++程序库开发。Boost在C++标准化过程中扮演深具影响力的角色
      • Boost提供许多TR1组件实现品,以及其他许多程序库

猜你喜欢

转载自blog.csdn.net/u010991048/article/details/38277719