Item49:了解new_handler的行为

当operator new抛出异常以反映出一个未获得满足的内存需求之前,它会先调用一个用户制定的错误处理函数,一个所谓的new-handler,为了制定这个“用以处理内存不足”的函数,用户必须调用set-new-handler,那是声明于中的一个标准程序库函数:

namespace std{
typedef void(*new_handler)();
new_handler set_new_handler(new_handler p) throw();//这里是nothrow吗?书中是throw
}

new_handler是个typedef,定义出一个指针指向一个函数,这个函数没有参数也不反悔任何东西,set_new_handler则是获得一个new_handler并且返回一个new_handler的函数,set_new_handler声明式尾端的”throw()”是一份异常明细,表明该函数不抛出任何异常(是不是nothrow?)

set_new_handler的参数也是个指针,指向operator new无法分配足够内存时候该被调用的函数,其返回值也是个指针,指向set_new_handler被调用前正在执行(但马上就要被替换)的那个new_handler函数,例如:

void outofMem()
{
std::cerr<<"无法分配内存";
std::abort();
}
int main()
{
std::set_new_handler(outofMem);
int * pBigDataArray=new int[100000000L];
}

一个涉及良好的new-handler函数必须做到以下事情:

  1. 让更多内存可被使用,实现策略是,程序一开始执行就分配一大块内存,而后当new_handler第一次被调用,将它们释还给程序使用。
  2. 安装另一个new_handler,如果这个new_handler无法获取更多可用内存,它可以自己调用set_new_handler来将其它函数来替换自己。
  3. 删除new_handler,也就是将null指针传给set_new_handler,一旦没有安装任何new_handler,operator new会在内存分配不成功时候抛出异常。
  4. 抛出bad_alloc异常,这样的异常不会被operator new捕捉,因此会传播到内存需求处。
  5. 不反悔,通常调用abort()或者exit()

    nothrow new是一个颇为局限的工具,因为它只适用于内存分配,后继的构造函数调用还是可能抛出异常。


Item50:了解new和delete的合理替换时机

在什么情况下会需要替换new和delete?

  1. 用来检测运行上的错误。
  2. 为了提高性能。
  3. 为了收集使用上的统计数据。
  4. 为了增加分配和归还的速度。
  5. 为了降低缺省内存管理器带来的空间额外开销。
  6. 为了尼姆缺省分配器中的非最佳齐位。
  7. 为了将相关对象成簇集中。
  8. 为了获得非传统行为。

Item51:编写new和delete时需固守成规

总结:①operator new应该内含一个无穷循环,并且其中尝试分配内存,如果它无法满足内存需求,就应该调用new_handler,它也应该有能力处理0字节申请。

②operator delete应该在收到null指针时候不做任何事情

《Effective C++》定制new和delete的更多相关文章

  1. Effective C++ —— 定制new和delete(八)

    STL容器所使用的heap内存是由容器所拥有的分配器对象管理,不是被new和delete直接管理.本章并不讨论STL分配器. 条款49 : 了解new-handler的行为 当operator new ...

  2. 高效C++:定制new和delete

    内存的申请和释放,C++从语言级别提供了new和delete关键字,因此需要了解和熟悉其中的过程. 了解new-handler的行为 set_new_handler可以指定一个函数,当申请内存失败时调 ...

  3. 【effective c++】定制new和delete

    条款49: 了解new-handler的行为 operator new 和 operator delete只适合用来分配单一对象.array所用的内存由operator new[]分配出来,并由ope ...

  4. Effective C++: 08定制new和delete

    49:了解new-handler的行为 当operator new无法满足某一内存分配需求时,它会抛出异常(以前会返回一个null).在抛出异常之前,它会调用一个客户指定的错误处理函数,也就是所谓的n ...

  5. 《Effective C++》定制new和delete:条款49-条款52

    条款49:了解new-handler的行为 当operator new无法分配出内存会抛出异常std::bad_alloc 抛出异常前会反复调用用户自定义的new-handler函数直至成功分配内存 ...

  6. 八、定制new和delete

    条款49:了解new-handler的行为 new异常会发生什么事? 在旧式的编译器中,operator new分配内存失败的时候,会返回一个null指针.而现在则是会抛出一个异常. 而在抛出这个异常 ...

  7. 《Effective C++》读书摘要

    http://www.cnblogs.com/fanzhidongyzby/archive/2012/11/18/2775603.html 1.让自己习惯C++ 条款01:视C++为一个语言联邦 条款 ...

  8. 《Effective C++》 阅读小结 (笔记)

    A person who is virtuous is also courteous. "有德者必知礼" 书本介绍:<Effective C++:改善程序与设计的55个具体做 ...

  9. C++ delete 和 delete []

    C++ delete 和 delete [] 简单结论: new delete new [] delete []   文章 : 对 delete [] 的声明 void operator delete ...

  10. effective c++ 思维导图

    历时两个多月的时间,终于把effective c++又复习了一遍,比较慢,看的是英文版,之前看的时候做过一些笔记,但不够详细,这次笔者是从头到尾的翻译了一遍,加了一些标题,先记录到word里面,然后发 ...

随机推荐

  1. JUC(5)BlockingQueue四组API

    1.读写锁ReadWriteLock package com.readlock; import java.util.HashMap; import java.util.Map; /** * ReadW ...

  2. 前端监控系列4 | SDK 体积与性能优化实践

    背景 字节各类业务拥有众多用户群,作为字节前端性能监控 SDK,自身若存在性能问题,则会影响到数以亿计的真实用户的体验.所以此类 SDK 自身的性能在设计之初,就必须达到一个非常极致的水准. 与此同时 ...

  3. ES6 学习笔记(十一)迭代器和生成器函数

    1.前言 JavaScript提供了许多的方法来获取数组或者对象中的某个元素或者属性(迭代).从以前的for循环到之后的filter.map再到后来的for...in和for...of的迭代机制.只要 ...

  4. Rust Aya 编写 eBPF 程序

    本文地址:https://www.ebpf.top/post/ebpf_rust_aya 1. 前言 Linux 内核 6.1 版本中有一个非常引人注意的变化:引入了对 Rust 编程语言的支持.Ru ...

  5. Go语言核心36讲52

    你好,我是郝林. 专栏到这里,就要结束了. 差不多在半年以前(2018年的第二个季度),极客时间的总编辑郭蕾找到我,说想让我写一个关于Go语言的技术专栏. 我那时候还在轻松筹担任大数据负责人,管理着四 ...

  6. 4 c++编程-提高篇-STL简介

    ​ 重新系统学习c++语言,并将学习过程中的知识在这里抄录.总结.沉淀.同时希望对刷到的朋友有所帮助,一起加油哦!  生命就像一朵花,要拼尽全力绽放!死磕自个儿,身心愉悦! 写在前面,本篇章主要简单介 ...

  7. 3 c++编程-提高篇-模版

    ​ 重新系统学习c++语言,并将学习过程中的知识在这里抄录.总结.沉淀.同时希望对刷到的朋友有所帮助,一起加油哦!  生命就像一朵花,要拼尽全力绽放!死磕自个儿,身心愉悦!  系列文章列表: 1 c+ ...

  8. SSH(一)架包的引入

    一年多未使用了,有些东西真的会忘. 一.ssh的图形化记忆运作流程 二.Struts2.hibernate.spring需要引用的jar包 Struts2: 基本开发:struts-2.3.32\ap ...

  9. 数电第二周总结_by_yc

    数电第二周总结_CC 重点: 模块实例化.仿真测试.数值表示.参数.表达式. 模块实例化端口连接方法: A.顺序端口连接:需严格按照模块定义时的顺序 B.明明端口连接:对端口信号顺序不做要求 Ex-1 ...

  10. MISC中的图片修改宽高问题

    在做CTF中MISC分类题目时,很常见的一个问题就是修改图片正确的宽与高 (此篇笔记中的内容以ctfshow中MISC入门分类为切入点,感兴趣的同学可以一边做一边有不会的看看,仅供参考,我是菜鸡) 曾 ...