new operator
和 operator new
是 C++ 中两个不同的概念。
1. new operator
(或称 new
操作符)
- 定义:
new operator
是 C++ 中的关键字,用于分配内存并调用构造函数来初始化对象。它不仅仅是分配内存,还包括对象的创建和初始化。 - 语法:
MyClass* obj = new MyClass(); // new operator
这里,new MyClass()
做了以下事情:
-
- 调用
operator new
为MyClass
分配内存。 - 调用
MyClass
的构造函数在分配的内存上创建一个对象。 - 返回指向新创建对象的指针。
- 调用
- 功能:
new operator
处理内存分配和对象初始化两个步骤。它是 C++ 中最常用的用于创建动态对象的表达式。
2. operator new
(或称 new
运算符函数)
- 定义:
operator new
是一个函数,专门用于分配原始内存(raw memory)。它只负责内存分配,不调用构造函数。 - 语法:
void* memory = operator new(sizeof(MyClass)); // operator new
这里的 operator new
只是为 MyClass
类型分配了足够的内存,返回的 memory
是一个 void*
指针。
- 功能:
例如:
void* memory = operator new(sizeof(MyClass)); // 分配内存
MyClass* obj = new(memory) MyClass(); // 在已分配的内存上构造对象
-
operator new
通常是系统提供的,也可以由用户重载以自定义内存分配行为。- 它只负责分配内存,不进行对象的初始化。初始化对象需要手动调用构造函数,通常使用
placement new
技术。
3. 关键区别
- 作用范围:
-
new operator
:用于动态创建并初始化对象,包括调用operator new
分配内存和调用构造函数初始化对象。operator new
:仅用于分配内存,不负责对象的初始化。
- 返回值:
-
new operator
返回一个指向已初始化对象的指针。operator new
返回一个指向分配内存的void*
指针。
- 使用场景:
-
new operator
是高级抽象,用于日常的对象动态分配和初始化。operator new
是底层机制,用于需要自定义内存分配策略的场景,例如优化性能或实现自定义内存池。
4. 总结
- 使用
new operator
来创建对象时,不仅分配了内存,还初始化了对象。 operator new
只是单纯地分配内存,通常和placement new
搭配使用以手动初始化对象。
理解这两者的区别对于深入掌握 C++ 内存管理和自定义对象的创建过程至关重要。