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!
广告