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
