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。

......

原文出处

1. 浅谈new与::operator new

posted @ 2026-01-05 16:22  超轶绝尘  阅读(4)  评论(0)    收藏  举报