开发者社区> nkbai> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

[C++再学习系列] 深入new/delete:Operator new的全局重载 -转载

简介: [C++再学习系列] 深入new/delete:Operator new的全局重载  http://blog.csdn.net/zhenjing/archive/2009/07/16/4354880.aspx Operator new 的全局重载 我们经常看到这么一句话: operator new 可以重载, placement new 不可重载。
+关注继续查看

[C++再学习系列] 深入new/delete:Operator new的全局重载 

http://blog.csdn.net/zhenjing/archive/2009/07/16/4354880.aspx

Operator new 的全局重载

我们经常看到这么一句话: 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 的第六个单元上

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
00后小哥哥,浅谈C++输入输出流及其重载
00后小哥哥,浅谈C++输入输出流及其重载
0 0
【C++要笑着学】运算符重载 | 赋值重载 | 取地址重载 | const成员
朋友们好啊,今天终于更新了。我是柠檬叶子C,本章将开始讲解运算符重载。运算符重载的技能是学习实现 STL 内部底层的不可缺少的 "利器" !所以本篇非常重要,下一篇会手把手实现一个Date类,可以进一步地实战体会运算符重载。
0 0
嵌入式linux基础:c++(四)重载 指针 引用
嵌入式linux基础:c++(四)重载 指针 引用
0 0
C++继承与派生解析(继承、重载/转换运算符、多重继承、多态、虚函数/纯虚函数、抽象类)
C++继承与派生解析(继承、重载/转换运算符、多重继承、多态、虚函数/纯虚函数、抽象类)
0 0
c++实验2(1.重载的函数 2.const关键字 3.动态内存分配利用new运算分配内存空间,利用delete运算或程序运行结束释放内存。)
编写程序,定义2个重载函数add并在main函数中应用,功能。编写重载函数并验证,函数功能:对数组赋值。.编写程序,利用动态内存进行数据存储,实现功能:输入2个数据分别表示矩形的长和高,输出矩形的周长和面积。
0 0
C++ 流插入和流提取运算符的重载
C++ 流插入和流提取运算符的重载
0 0
C++ 自增、自减运算符的重载和性能分析
C++ 自增、自减运算符的重载和性能分析
0 0
C++ 赋值运算符'='的重载(浅拷贝、深拷贝)
C++ 赋值运算符'='的重载(浅拷贝、深拷贝)
0 0
+关注
nkbai
区块链技术爱好者,智能合约安全专家
文章
问答
文章排行榜
最热
最新
相关电子书
更多
C++课程-对象模型
立即下载
使用C++开发PHP7扩展
立即下载
C++对象模型
立即下载