C++中new与::operator new有何区别?

摘要:1.为什么C++要引入newdelete? C语言内存管理方式在C++中是可以继续使用,比如malloc、realloc等函数。但有些地方这些传统的空间申请函数就显得
1.为什么C++要引入new/delete? C语言内存管理方式在C++中是可以继续使用,比如malloc、realloc等函数。但有些地方这些传统的空间申请函数就显得有些无能为力,而且使用起来比较麻烦。 是的,在C++的自定类型数据中,常需要在定义时顺便调用构造函数初始化。而原C语言的空间申请函数是没有这种功能,需要额外操作,于是C++提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。 简而言之,什么C++要引入new/delete的原因在于: new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间时,还会调用构造函数和析构函数。 2.operator new与operator delete函数 首先介绍它们是什么: 它们是C++中的内存分配原语函数。它们只负责分配和释放原始内存,不涉及对象的构造和析构。 它们的用法: #include <new> // 包含 operator new 和 operator delete 的声明 // 分配内存 void* memory = ::operator new(size_t bytes); // 释放内存 ::operator delete(void* ptr); 示例 #include <iostream> #include <new> int main() { // 分配10个int大小的内存 void* int_memory = ::operator new(10 * sizeof(int)); std::cout << "内存分配成功,地址: " << int_memory << std::endl; // 使用内存... // 释放内存 ::operator delete(int_memory ); std::cout << "内存已释放" << std::endl; return 0; } 它们与new/delete的关系: new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过 operator delete全局函数来释放空间。 表头 表头 单元格 单元格 单元格 单元格 操作 做的事情 int* p = new int(42); 1. 调用 operator new(sizeof(int)) 分配内存 2. 在内存上调用 int 的构造函数 构造对象(设为42) delete p; 1. 调用 p 的析构函数 析构对象 2. 调用 operator delete(p) 释放内存 void* mem = ::operator new(sizeof(int)); 只分配内存,不调用构造函数 ::operator delete(mem); 只释放内存,不调用析构函数 简单说:new/delete = (operator new/operator delete + 构造函数/析构函数调用) 注意:和new与delete,new[ ]与delete[ ]相同,operator new只能与operator delete匹配。 它们的实际作用 回到前言部分,为什么vector的private成员为什么要用三个封装后的迭代器指针,来替代原本数据结构顺序表中的成员变量呢? 在查看vecotr的实际实现代码中,我发现 vector类中涉及空间增删的函数,实际上都是调用的reserve函数,而在reserve函数中则使用了operator new/delete。 ...... 原文出处 1. 浅谈new与::operator new