Effective C++ 笔记(8.定制new和delete)

     多线程环境下的内存管理,遭受单线程系统不曾有过发挑战。由于heap是一个可被改动的全局性资源,因此多线程系统充斥着发狂访问这一类资源的race conditions(竞速状态)出现机会。
    如果没有适当的同步控制(synchronization),一旦使用无锁(lock-free)算法或精心防止并发访问(concurrent access)时,调用内存例程可能很容易导致管理heap的数据结构内容败坏。

operator new和operator delete只适合来分配单一对象。Arrays所用的内存有operator new[]分配出来,并由operator delete[] 归还。

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


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

设计良好的new-handler函数必须做以下事情:
  • 让更多内存可被使用。这便造成operator new内的下一次内存分配动作可能成功。实现此策略的一个做法是,程序一开始执行就分配一大块内存,而后当new-handler第一次被调用,将它们释还给程序使用。
  • 安装另一个new-handler。
  • 卸除new-handler,也就是null指针传给set_new_handler。一旦没有安装任何new-handler,operator new会在内存分配不成功时抛出异常。
  • 抛出bad_alloc(或派生自bad_alloc)的异常。这样的异常不会被operator new捕捉,因此会被传播到内存索求处。
  • 不返回,通常调用abort或exit。

请记住:
  • set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用。
  • Nothrow new是一个颇为局限的工具,因为它只适用于内存分配;后继的构造函数调用还是可能抛出异常。

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

有人想要替换编译器提供的operator new或operator delete,下面是三个最常见的理由:
  • 用来检测运用上的错误。
  • 为了强化效能。
  • 为了收集使用上的统计数据。

何时可在“全局性的”或”class专属的“基础上合理替换缺省的new和delete?
  • 为了检测运用错误。
  • 为了收集动态分配内存之使用统计信息。
  • 为了增加分配和归还的速度。
  • 为了降低缺省内存管理器带来的空间额外开销。
  • 为了弥补缺省分配器中的非最佳齐位(suboptimal alignment)。
  • 为了将相关对象成簇集中。
  • 为了获得非传统的行为。

请记住:
  • 有许多理由需要写个自定 new和delete,包括改善效能、对heap运用错误进行调试、收集heap使用信息。

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

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

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

请记住:
  • 当你写一个placement operator new,请确定也写出了对应的placement operator delete。如果没有那么做,你的程序可能会发生隐微而时续的内存泄漏。
  • 当你声明placement new和placement delete,请确定不要无意识地遮掩了它们的正常版本。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Effective C++ 中文版》是由Scott Meyers所编写的一本关于C++编程的指南。它不仅是C++编程者的必备书籍,也是所有编程人员的经典读物。本书在讲解C++编程过程中,给出了许多实用的技巧和建议,帮助程序员更好地使用C++编写高效、可靠的程序。 本书共包含50个条款,每个条款都包含一个具有实际意义的问题和解决方案。这些解决方案是作者多年编写C++代码的经验总结,结合了C++的最佳实践,旨在帮助读者更好地理解C++的语言特性和语言使用习惯。这些技巧从简单到复杂,由浅入深地介绍了如何编写高效的C++代码。 在本书中,你将学习到: 1. 内存管理技巧。包括如何使用智能指针、如何处理内存泄漏问题等。 2. 类设计和继承技巧。包括如何设计和实现抽象基类、虚函数等。 3. 异常处理和错误处理。包括如何处理异常、如何正确使用异常、如何进行错误处理等。 4. 代码优化和调试技巧。包括如何做好代码优化、如何进行调试、如何实现高效数据结构等。 《Effective C++ 中文版》不仅适用于初学者,也适合有一定经验的C++开发人员参考。它是一本非常实用的、能帮助你更好地理解和掌握C++编程技巧的书籍。无论你是一名编程新手还是有多年经验的专业开发人员,都值得一读。 ### 回答2: 《Effective C++ 中文版》是一本关于C++编程的经典书籍。其中包含了许多有关C++编程的实用技巧,以及注意事项和最佳实践。本书的作者Scott Meyers是一位著名的C++专家,通过本书他在编程技巧和C++语言语法方面给我们提供了很多宝贵的经验。本书主要分为50个章节,每一个章节有自己的主题,涉及面非常广泛,包括了一些比较基础的C++概念,以及一些高级的编程技巧和设计模式的应用。其中一些章节是非常值得注意的,比如说有关内存管理,函数重载以及类设计等等。 通过《Effective C++ 中文版》这本书,读者可以学到很多C++编程的实用技巧,这些技巧在实际开发中非常有用。例如,书中介绍了如何正确使用函数重载,如何避免内存泄漏以及如何正确地设计类等等。此外,这本书对于大家掌握C++的语法和一些编程技巧以及习惯养成等方面也是非常有帮助的。因此,《Effective C++ 中文版》是一本非常值得阅读的C++经典之作,对于C++初学者和专业程序员都是有益的。 ### 回答3: 《Effective C》是一本关于C语言编程的实用指南,旨在帮助读者更加高效地使用C语言进行开发。本书作者为Scott Meyers,是知名的C++编程之父,在本书中他分享了自己多年来在C语言领域的经验和技巧。 本书主要分为四个部分,分别是基础知识、指针、内存管理和高级技巧。第一部分主要介绍C语言的基本语法和特性,包括编码风格、数据类型、流程控制等;第二部分则深入讲解指针的概念和用法,包括指针的语法、指针和数组、指针和函数等;第三部分主要涉及内存管理方面的知识,包括动态内存分配、内存泄漏、内存地址等;第四部分则介绍一些高级技巧,如位操作、函数指针、字符串操作等。 本书着重强调了C语言的“低级别”特性,如指针和内存管理,这正是C语言的优越之处。但同时,这些特性也是导致C语言存在一些常见问题的根源,如内存泄漏、野指针等。因此,本书特别注重这些问题的防范和解决方法,为读者提供了很多实用的技巧和建议。 总之,《Effective C》是一本非常实用和有价值的C语言编程指南。无论是新手还是经验丰富的程序员,都可以从本书中学到很多东西,提升自己的编程水平和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值