《Effective C++》定制new和delete:条款49-条款52
条款49:了解new-handler的行为
- 当operator new无法分配出内存会抛出异常std::bad_alloc
- 抛出异常前会反复调用用户自定义的new-handler函数直至成功分配内存
// 自定义new_handler函数
void outOfMem() {
cerr << "Unable to satisfy request for memory" << endl;
abort();
}
//测试
int main() {
set_new_handler(outOfMem); //写入new_handler函数
int* pBigDataArray = new int[100000000000000000L];
return 0;
} //输出 :Unable to satisfy request for memory
//声明于<new>中的标准程序函数
namespace std {
typedef void (*new_handler) ();
new_handler set_new_handler(new_handler p) throw();
}
- 为不同的class写不同的new-handler函数
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
class NewHandlerHolder {
public:
explicit NewHandlerHolder(new_handler nh)
: handler(nh) {}
~NewHandlerHolder() {std::set_new_handler(handler);}
private:
new_handler handler;
NewHandlerHolder(const NewHandlerHolder&) {}
NewHandlerHolder& operator= (const NewHandlerHolder&) {}
};
template<typename T>
class NewHandlerSupport {
public:
static new_handler set_new_handler(new_handler p) throw();
static void* operator new[](size_t size) throw(bad_alloc);
private:
static new_handler currentHandler;
};
template<typename T>
new_handler NewHandlerSupport<T>::currentHandler = 0;
template<typename T>
new_handler NewHandlerSupport<T>::set_new_handler(new_handler p) throw() {
new_handler oldHandler = currentHandler;
currentHandler = p;
return oldHandler;
}
template<typename T>
void* NewHandlerSupport<T>::operator new[](size_t size) throw(bad_alloc) {
NewHandlerHolder h(std::set_new_handler(currentHandler));
return ::operator new[](size);
}
class Widget : public NewHandlerSupport<Widget>{
};
void outOfMem() {
cerr << "Unable to satisfy request for memory" << endl;
abort();
}
int main() {
Widget::set_new_handler(outOfMem);
Widget* pwl = new Widget[100000000000L];
return 0;
}
条款50:了解new和delete的合理替换时机
- 有许多理由需要自定new和delete,包括改善性能、对heap运用错误进行调试、手机heap使用信息
条款51:编写new和delete时需固守常规
- operator new 应该包含一个无穷循环,并在其中尝试分配内存,如果无法满足内存需求,就调用new-handler函数,且要有能力处理 0 bytes申请。
- operator delete应该在收到null指针时不做任何事情
条款52:写了placement new也要写placement delete
- 当写new的表达式\(Widget* pw = new Widget\)时,两个函数被调用
- 一个是用以分配内存的 operator new
- 另一个是Widget的default构造函数
- 如果在调用构造函数失败,编译器会寻找一个“带相同额外参数”的operator delete,找不到调用不了,会造成资源泄漏
《Effective C++》定制new和delete:条款49-条款52的更多相关文章
- Effective C++ —— 定制new和delete(八)
STL容器所使用的heap内存是由容器所拥有的分配器对象管理,不是被new和delete直接管理.本章并不讨论STL分配器. 条款49 : 了解new-handler的行为 当operator new ...
- 【effective c++】定制new和delete
条款49: 了解new-handler的行为 operator new 和 operator delete只适合用来分配单一对象.array所用的内存由operator new[]分配出来,并由ope ...
- EC读书笔记系列之19:条款49、50、51、52
条款49 了解new-handler的行为 记住: ★set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用 ★Nothrow new是一个颇为局限的工具,∵其只适用于内存 ...
- 八、定制new和delete
条款49:了解new-handler的行为 new异常会发生什么事? 在旧式的编译器中,operator new分配内存失败的时候,会返回一个null指针.而现在则是会抛出一个异常. 而在抛出这个异常 ...
- STL笔记(5)条款49:学习破解有关STL的编译器诊断信息
STL笔记(5)条款49:学习破解有关STL的编译器诊断信息 条款49:学习破解有关STL的编译器诊断信息 用一个特定的大小定义一个vector是完全合法的, vector<int> v( ...
- 高效C++:定制new和delete
内存的申请和释放,C++从语言级别提供了new和delete关键字,因此需要了解和熟悉其中的过程. 了解new-handler的行为 set_new_handler可以指定一个函数,当申请内存失败时调 ...
- Effective C++: 08定制new和delete
49:了解new-handler的行为 当operator new无法满足某一内存分配需求时,它会抛出异常(以前会返回一个null).在抛出异常之前,它会调用一个客户指定的错误处理函数,也就是所谓的n ...
- Effective C++ -----条款49:了解new-handler 的行为
set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用. Nothorw new 是一个颇为局限的工具,因为它只适用于内存分配:后继的构造函数调用还是可能抛出异常.
- Effective C++:条款27——条款
条款27:尽量少做转型动作 单一对象可能拥有一个以上的地址!
随机推荐
- 在ASP.NET MVC 项目中 使用 echarts 画统计图
echarts 官方地址:http://echarts.baidu.com/ 一.根据图中的数据怎么从数据库中获取并组装成对应格式: 从数据库中获取对应数据,然后在项目中引用Newtonsoft.Js ...
- PHP中利用pcntl实现多进程(模拟多线程)实例(转)
windows不支持pcntl的多线程(非Unix类系统不支持此模块),pcntl在很久很久之前就听过了,但是一直没有尝试着真正要用它. 这不,遇到socket问题了,看socket,遇到pcntl了 ...
- LIMIT与OFFSET的使用
limit 与 offset:从下标0开始 offset X 是跳过X个数据 limit Y 是选取Y个数据 limit X,Y 中X表示跳过X个数据,读取Y个数据 例如: sele ...
- Django---forms表单使用(2)
Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 from dja ...
- Vue移动端项目模板
一个集成移动端开发插件的Vue移动端模板包含1.css: 使用stylus开发css 集成reset样式文件 修改UI组件文件 统一样式处理(如主题色等)2.UI组件 使用热门的vant与mint-u ...
- 智能化CRM客户关系管理系统介绍一
智能化CRM客户关系管理系统介绍一 CRM客户关系管理的定义是:企业为提高核心竞争力,利用相应的信息技术以及互联网技术来协调企业与顾客间在销售.营销和服务上的交互,从而提升其管理方式,向客户提供创新式 ...
- 使用bfd监控静态路由,达到网络故障及时切换功能。
结论:通过BFD可以联动静态路由,从而监控整个网络上的网络情况,当出现故障时及时进行切换. 下面的例子,就是通过BFD监控上面的这个往返路由,当中间网络出现故障时,两端全部切换到下面的第二条路由进行通 ...
- 安卓开发:UI组件-图片控件ImageView(使用Glide)和ScrollView
2.7ImageView 2.7.1插入本地图片 一个图片控件,可以用来显示本地和网络图片. 在首页添加按钮ImageView,指向新页面(步骤与前同,不再详写). activity_image_vi ...
- Jmeter设置代理,抓包之app请求
步骤: 1. Jmeter选择测试计划,添加线程组,添加http请求,添加监听器-察看结果树 2. 添加http代理服务器,右键添加非测试元件-添加http代理服务器 3. 端口改为8889,目标控制 ...
- WinServer-FTP搭建
FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务. FTP是File Transfer Protocol ...