operator new : 重载new运算符

C++ 的new有三步:  调用运算符 new,  分配内存operator new,   调用构造函数 new(ptr) constructor. 

1 - 运算符 new 不可以重载: 所以 void* operator new() {   }   是无法通过编译的。

2 -  分配内存的new(size_t) 是唯一可以重载的: void* operator new(size_t  size) {  return malloc(size);    } ;

3 - constructor new:  调用构造函数,这一步可以不通过new运算符调用, 你可以手动malloc一个内存,然后constructor new去构造一个对象。

例如:

void* operator new(size_t  size) {  cout<<"my  operator new \n";   return malloc(size);    } ;  //可以做些额外的工作,如统计内存使用

void* operator new(size_t  size, int a,  int b, int c) { ...};   //还可以带些我们自己想要的参数,一般__FILE__,__LINE__比较多, 调用时写法时这样的:constructor* p =  new(a,b,c)  constructor;

int main()

{

 int*  p1 = new int;  //输出  “my  operator new”  //根据对象类型优先调用类型内部定义的 class::operator new,

//没找到再使用全局的::operator new; 

char* p2 = new char; //输出  “my  operator new”

//可以有如下不一般的操作, 把new的步骤分开一步步自己走

int* p3 =  ::operator new(4);  //分配内存(直接拿来当int使用也是没问题,毕竟都是4字节)

new(p3) int ; //或者有带参数的构造函数时  new(p3) your_class( args); 

 // new ( ptr )  constructor ; 在内存池的应用上比较广泛,需要掌握

 

char* p4 = new(1,2,3) char;  //或者  char *p4 = operator new(sizeof(char), 1,2,3);   new(p4) char; 

}

 

注意:new(ptr) 【数组】;   当用于数组的初始化构造时,ptr的内存必须要比实际数组大小要大4字节,这是数组用来记录数组大小的额外空间,容易掉坑

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值