C++ 中“new 运算符”和“operator new”的区别?


在 C++ 中,当我们想要创建一个新的对象时,必须在内存中创建一个内存块,然后还要调用构造函数来初始化该内存块。我们可以使用 new 关键字来创建内存元素。这个 new 运算符执行了两个连续的任务。但是 operator new 仅创建内存空间。

New 关键字

new 运算符是一种特殊的运算符,表示对堆部分进行内存分配的请求。只有在有足够的可用内存时,new 运算符才会将内存初始化到指针变量。当我们使用普通的 new 关键字创建对象时,它会执行两个连续的任务

  • ? 为对象分配堆部分的内存块
  • ? 调用构造函数初始化内存块。

示例代码

#include <iostream>
using namespace std;
class Box {
   public:
   Box() {
      cout << "Constructor called!" <<endl;
   }
};
int main() {
   Box* myBox = new Box;
}

输出

Constructor called!

Operator New

operator new 是一个函数。此函数用于重载 new 运算符。使用它,我们可以分配原始内存块。这在概念上类似于 malloc() 或 calloc() 函数。此函数不调用构造函数,因此内存未初始化。但是,在从该重载方法返回指针后,编译器会在之后调用构造函数。

示例代码

#include <iostream>
#include <cstdlib>
using namespace std;
class Box {
   public:
   Box() {
      cout << "Constructor called!" <<endl;
   }
   void *operator new(size_t size) {
      cout << "Call Operator New"<<endl;
      void *p = malloc(size);
      return p;
   }
};
int main() {
   Box* myBox = new Box;
}

输出

Call Operator New
Constructor called!

更新于: 2019年7月30日

1K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告