Operator new 的全局重载

原文地址:http://blog.csdn.net/zhenjing/article/details/4354880

我们经常看到这么一句话: operator new 可以重载, placement new 不可重载。其实此处所说的不可重载应该是指全局的 placement new 不可重载,对于类域中的 placement new 是可以重载的,而且只要重载了任何一种形式的 operator new 都应该顺便重载 placement new , 即 void * operator new(std::size_t count, void *ptr) 。

操作符重载一般用于特定类型,名字解析过程同一般的函数重载。 Operator new 由于其特殊性,编译器提供了默认提供 6 种全局重载形式,同时还允许用户提供自定义的全局 operator new ,其参数甚至可以和全局版本一样,除全局 placement new 外。对于类域,任何形式的 new 都是可以重载的,包括 placement new 形式。

全局的 operator new( 函数 ) 有六种重载形式

void *operator new(std::size_t count)

throw(std::bad_alloc);           // 一般的版本

void *operator new(std::size_t count,   // 兼容早版本的 new

const std::nothrow_t&) throw();   // 内存分配失败不会抛出异常

void *operator new(std::size_t count, void *ptr) throw();  //placement 版本

void *operator new[](std::size_t count)  //

throw(std::bad_alloc);

void *operator new[](std::size_t count,  //

const std::nothrow_t&) throw();

void *operator new[](std::size_t count, void *ptr) throw();

重载 operator new 规则

重载 operator new 的参数个数是可以任意的 , 只需要保证第一个参数为 size_t, 返回类型为 void * 即可 , 而且其重载的参数类型也不必包含自定义类型 . 更一般的说 , operator new 的重载更像是一个函数的重载 , 而不是一个操作符的重载 . 如:

全局重载示例:

void* operator new(size_t size)  // 重载成功

{

printf("global new/n");

return malloc(size);

//return ::operator new(size);  // 递归调用提示 (warning)

}

//void *operator new(std::size_t size, void *ptr) // 无法重载

//{

//     printf("global new/n");

//     return ::operator new(size,ptr);

//}

void * operator new(size_t size, const std::nothrow_t& e) // 重载成功 , 递归调用提示 (warning)

{

printf("global new/n");

return ::operator new(size, e);

}

一般形式的 operator new 重载示例:

void * operator new(size_t size, int x, int y, int z)

{

...

}

X * pX = new (1, 2, 3) X;

char data[1000][sizeof(foo)];

inline void* operator new(size_t size, int n)

{

return data[n];

}

就可以使用这样有趣的语法来创建对象 :

foo *p=new(6) foo(); // 把对象创建在 data 的第六个单元上

转载于:https://www.cnblogs.com/dragon2012/p/3571838.html

深入new/delete:Operator new的全局重载相关推荐

  1. c++运算符的全局重载

    今天在看候捷的那本stl的时候,第二章有这么一段话 注意,由于*iter != value来检查元素值是否吻合,但是本例中value的数据类型是 int,iter的类型是ListItem<int ...

  2. c++ operator百样操作符重载(详解)

    目录 一.operator== :等号判断重载 二.operator = : 等号赋值重载 三.operator != : 不等于重载 四.operator> : 大于号 或者 小于号 重载 五 ...

  3. Cpp 对象模型探索 / operator new、operator delete、operator new[] 和 operator delete [] 重载

    零.前言 对于函数 operator new 和 operator delete 来说,分为全局重载和局部重载. 全局重载的形式: void *::operator new(size_t size); ...

  4. C++ 工程实践(2):不要重载全局 ::operator new()

    陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 本文只考虑 Linux x86 平台,服务端开发(不考虑 Windows 的跨 DLL 内存分配释放问题) ...

  5. 重载new、delete和强制类型转换运算符()

    1.重载new和delete运算符 内存管理运算符new.new[].delete和delete[]也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就 ...

  6. C++中的new和delete操作符重载

    文章目录 1 new和delete操作符重载 1.1 new和delete操作符重载简介 1.2 静态存储区中创建动态对象 1.3 在指定的地址上创建C++对象 2 new[]和delete[]操作符 ...

  7. C++ 【学习笔记】 - 基础(class、inline、explict、new、delete、static、this、mutable、friend、operator、virtual)

    上上一篇:java全家桶 上一篇:C语言 [学习笔记] - 基础.理论(原码/反码/补码).函数(字符串.定义).指针.内存(函数.结构).复合类型.函数(调用原理.指针.接口) 视频:https:/ ...

  8. c++重载运算符_C/C++编程笔记:运算符重载丨重载C++中的New和Delete运算符

    new和delete运算符也可以像C ++中的其他运算符一样重载.New和Delete运算符可以全局重载,也可以在特定类中重载. (1)如果使用某个类的成员函数来重载这些运算符,则意味着这些运算符仅针 ...

  9. C++中operator关键字(重载操作符)

    operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名. 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算 ...

最新文章

  1. 电子商务网站的经验教训
  2. 纠结的Python2.7编码与os.walk()函数的目录参数
  3. 回复:lerit的关于对象中字段的初始化问题
  4. 登录form php一个页面跳转页面,Extjs4中表单登录功能、登录成功跳转页面的代码...
  5. 有道云笔记不需要通过开通会员的方式来去除广告显示
  6. 《H5 移动营销设计指南》 读书笔记整理
  7. java privilege的用法_java反射--注解的定义与运用以及权限拦截
  8. DBASK问答集萃第二期
  9. Redmi K50电竞版卖点投票:120W神仙秒充一骑绝尘
  10. vba两个集合的差集_Python中的集合是如何使用的?
  11. 产品研发过程管理专题——产品需求分析原则二
  12. 从产品角度谈如何搞定主动用户与被动用户
  13. Android中网络流量控制(防火墙)——Iptables
  14. Android单机游戏保存进度,安卓游戏存档修改教程 | 手游网游页游攻略大全
  15. 【开源项目分享】GitHub中文排行榜 - 帮助你发现高分优秀中文项目-Java
  16. 波动率模型:现货、期货及期货期权
  17. Adobe Bridge 2020新增功能
  18. 【多功能改进】基于OpenCV图像采集的人脸识别网络推流及局域网无线控制系统(将图像在URL地址上输出,可做成网络摄像头,带识别框)
  19. docker安装pytorch + TensorRT环境 + 自定义镜像视频流
  20. LeetCode151|翻转字符串中的单词III

热门文章

  1. 最大流EK和Dinic算法
  2. 音频信号发生器_1957年,DIY的Hi-Fi 电唱机单电子管音频发生器的音质保真度高...
  3. vector 中的元素去重
  4. Java6上开发WebService
  5. 计算机工作原理 仿真,虚拟DCS仿真工作原理
  6. java字符串学习_java之字符串学习记录
  7. killall 后面信号_Linux 下使用 killall 命令终止进程的 8 大用法
  8. 七夕(情人节)表白女朋友,程序员应该如何装一波13
  9. 怎么样才能玩转前端所有的CSS背景相关问题?
  10. 二手宏碁上网本装linux,Acer国内20日首发“上网本” 放弃Linux使用XP