分清new operator关键字与operator new操作符函数;了解重载operator new的调用问题

1、解释:
new operator:指我们在C++里通常用到的关键字,比如A* a = new A;
operator new:它是一个操作符,并且可被重载(类似加减乘除的操作符重载)

A* a = new A;

2、执行过程:

  1. operator new(size_t)来分配内存,如果类A重载了operator new,那么将调用A::operator new(size_t ),否则调用全局::operator new(size_t ),后者由C++默认提供
  2. 调用A::A()构造对象;
  3. 返回分配指针。

注:这里的重载遵循作用域覆盖原则,即在里向外寻找operator new的重载时,只要找到operator new()函数就不再向外查找,如果参数符合则通过,如果参数不符合则报错,而不管全局是否还有相匹配的函数原型。

3、placement new的应用:

// placement new
#include <new>
A* p = (A*)::operator new(sizeof(A)); //分配   
new(p) A(); //构造   
p->~A();   //析构  

注:注意sizeof(A)用于求需要分配内存大小

4、重载operator new:
类内重载operator new操作符,在调用new关键字时就会首先调用自己的重载版本。

class A{ 
public:
  //重载形式1
  static void *operator new(size_t size)
  {
    std::cout<<"call A operator new"<<std::endl;
    return malloc(size);
  }
  //重载形式2
  static void operator delete(void *ptr); 
  void* A::operator new(size_t size)
  {
    std::cout<<"call A operator new"<<std::endl;
    return ::operator new(size);
  }
  ... 
}; 

注:重载operator new操作符函数需要为static,因为其属于类,且先于类对象存在

本文的来源:
我学习中的疑惑:什么情况下调用自己在类内重写的operator new函数?
高手的解答:【C++】C++ 内存分配(new,operator new)详解 此文特别推荐看,写的非常好。

总结:

1、new operator会调用operator new函数,operator new函数可重载,且类内重载需为static。
2、operator new中会首先计算sizeof(A)作为参数。
3、特别推荐看,【C++】C++ 内存分配(new,operator new)详解 ,写的非常好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值