【读书笔记】【Effective C++】定制 new 和 delete、杂项讨论

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

  • 当 operator new 抛出异常以反映一个未获满足的内存需求之前,它会先调用一个客户指定的错误处理函数,一个所谓的 new-handler。
    • 当 operator new 无法满足内存申请时,它会不断调用 new-handler 直到找到足够的内存。
  • 所以一个设计良好的 new-handler 函数必须做出以下事情:
    1. 让更多的内存可被使用;
    2. 安装另一个 new-handler;
    3. 卸除 new-handler;
    4. 抛出 bad_alloc 的异常;
    5. 不返回。
  • 1993 年以前,C++ 要求 operator new 必须在无法分配足够内存时返回 null。
    • 新一代的 operator new 则应该抛出 bad_alloc 异常。
    • 但很多 C++ 程序是在编译器开始支持新规范前写出来的,所以 C++ 委员会还提供一个 nothow 方式的 new 来返回 null。
  • set_new_handler 允许客户指定一个函数,在内存分配无法获得满足时被调用。

条款 50:了解 new 和 delete 的合理替换时机

  • 有许多理由需要写一个自定义的 new 和 delete,包括改善效能、对 heap 运用错误进行调试、收集 heap 使用信息等。
    • 但总的来说,定制 new(重载 new 操作符)要考虑许多细节问题,一般而言在必要时才试着写写看。

条款 51:编写 new 和 delete 时需固守常规

  • operator new 应该内含一个无穷循环,并在其中尝试分配内存,如果它无法满足内存需求,就该调用 new-handler。
    • 它也应该有能力处理 0 bytes 申请。
    • Class 专属版本还应该处理比正确大小更大的申请。
  • operator delete 应该在收到 null 指针时不错任何事。
    • Class 专属版本则还应该处理比正确大小更大的申请。

条款 52:写了 placement new 也要写 placement delete

  • 如代码所示:
    Widget * pw = new Widget;
    
  • 如果在 Widget 的构造函数内发生异常,那么 pw 并没有接管新 new 出的内存空间,客户没有能力归还内存;这种情况下,C++ 运行期系统就会调用与 new 相对应的 delete。
    • 如果找不到相应的 delete,就会什么都不做,从而造成内存泄露。【所以重写 new 也要配套地重写 delete】
  • 当你声明 placement new 和 placement delete,请确定不要无意识(非故意)地掩盖了他们的正常版本(即普通 new)。

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

  • 如题所示。

条款 54:让自己熟悉包括 TR1 在内的标准程序库

  • TR1 只是一份规范,实物来源是 boost。

条款 55:让自己熟悉 boost

  • 如题所示。

你可能感兴趣的:(#,Effective,C++,c++)