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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值