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!
广告
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP