跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 内存管理:new/delete 原理及与 malloc/free 对比

C++ 动态内存管理的 new 和 delete 操作符。阐述了其针对内置类型和自定义类型的实现原理,包括构造/析构函数的调用时机。对比了 new/delete 与 C 语言 malloc/free 的区别,涵盖初始化、异常处理、函数与操作符差异等方面,帮助开发者理解底层机制并正确使用。

GitMaster发布于 2026/3/25更新于 2026/7/343 浏览

一、C++ 内存管理方式

C 语言的内存管理方式在 C++ 中可以继续使用,但有些地方就无能为力,而且使用起来相对繁琐一些,因此,C++ 又提出了自己的内存管理方式:通过 new 和 delete 操作符进行动态内存管理。

1.1 new/delete 操作内置类型

void test() {
    // 动态申请一个 int 类型的空间
    int* ptr1 = new int;
    // 动态申请一个 int 类型的空间并初始化为 10
    int* ptr2 = new int(10);
    // 动态申请 10 个 int 类型的空间
    int* ptr3 = new int[10];
    delete ptr1;
    delete ptr2;
    delete[] ptr3;
}

1.2 new/delete 操作自定义类型

在操作自定义类型的空间时,new 会调用构造函数,delete 会调用析构函数,而 malloc 和 free 不会。

#include <iostream>
using namespace std;

class A {
public:
    A(int a = 0) : _a(a) { cout << "A():" << this << endl; }
    ~A() { cout << "~A():" << this << endl; }
private:
    int _a;
};

int main() {
    // new/delete 调用构造函数/析构函数
    A* p1 = (A*)malloc(sizeof(A));
    A* p2 = new A(1); // 调用构造函数
    free(p1);
    delete p2; // 调用析构函数
    
    // 内置类型几乎一样
    int* p3 = (int*)malloc(sizeof(int));
    int* p4 = new int;
    free(p3);
    delete p4;
    
    A* p5 = (int*)malloc(sizeof(A)*10);
    A* p6 = new A[10];
    free(p5);
    delete[] p6;
    return 0;
}

二、operator new 与 operator delete 函数

new 和 delete 是用户进行动态内存申请和释放的操作符,operator new 和 operator delete 是系统提供的全局函数,new 在底层调用 operator new 全局函数来申请空间,delete 在底层通过 operator delete 全局函数来释放空间。

三、new 和 delete 的实现原理

3.1 内置类型

如果申请的是内置类型的空间,new 和 malloc,delete 和 free 基本类似,不同的地方是:new/delete 申请和释放的是单个元素的元素空间,new[] 和 delete[] 申请的是连续空间,而且 new 在申请空间失败时会抛出异常,malloc 会返回 NULL。

3.2 自定义类型

  • new 的原理
    1. 调用 operator new 函数申请空间
    2. 在申请的空间上执行构造函数,完成对象的构造
  • delete 的原理
    1. 在空间上执行析构函数,完成对象中资源的清理工作
    2. 调用 operator delete 函数释放对象的空间
  • new T[N] 的原理
    1. 调用 operator new[] 函数,在 operator new[] 中实际调用 operator new 函数完成 N 个对象空间的申请
    2. 在申请的空间上执行 N 次构造函数
  • delete[] 的原理
    1. 在释放的对象空间上执行 N 次析构函数,完成 N 个对象中资源的清理
    2. 调用 operator delete[] 释放空间,实际在 operator delete[] 中调用 operator delete 来释放空间

四、malloc/free 和 new/delete 的区别

malloc/free 和 new/delete 的共同点是:都是从堆上申请空间,并且需要用户手动释放。其不同点见如下表格:

malloc/freenew/delete
函数操作符
申请的空间不会初始化可以初始化
需要手动计算空间大小并传递后跟类型即可,若为多个对象在 [] 中指定
malloc 返回类型为 void*使用须强转new 后跟的是空间的类型
malloc 申请空间失败返回 NULL 必须判空new 不需要判空但需要捕获异常
自定义类型对象时只会开辟空间申请自定义类型对象时会调用构造函数和析构函数

总结

本文介绍了 C++ 中内存管理的操作符 new 和 delete,并详细介绍了他们的使用方法和基本原理同时与 C 中的 malloc 函数和 free 函数做对比,深化理解了二者的不同,便于更好的使用二者。

目录

  1. 一、C++ 内存管理方式
  2. 1.1 new/delete 操作内置类型
  3. 1.2 new/delete 操作自定义类型
  4. 二、operator new 与 operator delete 函数
  5. 三、new 和 delete 的实现原理
  6. 3.1 内置类型
  7. 3.2 自定义类型
  8. 四、malloc/free 和 new/delete 的区别
  9. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Vue 3 编程的 10 个实用技巧
  • Trae 集成 Figma MCP 实现前端代码自动生成
  • VS Code 前端开发必备 10 款插件及配置指南
  • Java 流程控制:从条件判断到循环遍历
  • CycleGAN 详解与实现
  • 为什么 AI 开发首选 Python 而非 Java 或 C++?
  • 解决 Java 源发行版 17 与目标发行版不匹配问题
  • AI 鉴伪技术解析:人脸视频、AIGC 图像及文档篡改检测
  • C++ STL 容器常用函数与实战技巧
  • 滑动窗口算法详解:经典例题解析
  • 向量数据库与 RAG 应用架构解析(上)
  • Java 社区跑腿家政上门服务商城解决方案
  • 基于 Leaflet 和天地图的长沙免费运动场所 WebGIS 可视化
  • Windows 系统下 Stable Diffusion WebUI 环境搭建指南
  • CosyVoice3 支持 ARPAbet 音素标注,提升英文发音准确性
  • C++ 哈希表底层实现:unordered_map/set、位图与布隆过滤器
  • Python 开发 MongoDB 数据库 MCP Server 实战指南
  • Stable Diffusion WebUI 无障碍改造:键盘导航与屏幕阅读器适配
  • 数据结构初阶:基于动态顺序表实现通讯录
  • LangChain 框架核心模块与使用指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online