C++学习笔记 56 new与::operator new
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。
......

浙公网安备 33010602011771号