当前位置: 首页 > article >正文

C++ 动态内存管理深度解析:new/delete 完全指南

引言在 C 语言中我们使用 malloc()、calloc()、realloc() 和 free() 来管理动态内存。而 C 引入了全新的动态内存管理方式——new 和 delete。这不仅带来了语法上的简化更重要的是引入了类型安全和初始化的概念。在学习过程中我对 new 的理解仅仅停留在“申请内存”这个层面。直到有一天我深入研究了 placement new 和 operator new 的区别才真正理解了 C 内存管理的精妙之处。第一部分C 语言的内存管理回顾C 语言的内存管理函数在深入了解 C 的 new 之前我们先回顾一下 C 语言的内存管理方式#include stdlib.h #include string.h int main() { // malloc: 申请内存不初始化 int* arr1 (int*)malloc(5 * sizeof(int)); if (arr1 NULL) return -1; // 需要检查是否申请成功 // 手动初始化 memset(arr1, 0, 5 * sizeof(int)); for (int i 0; i 5; i) printf(%d , arr1[i]); // 释放内存 free(arr1); return 0; }C 语言内存管理的缺点需要手动计算字节大小需要强制类型转换不会自动初始化需要检查返回值是否为 NUL第二部分C 的 new/delete 基础一、new 和 delete 的基本用法C 的 new 关键字解决了 C 语言内存管理的诸多痛点// 基本用法申请单个变量 int* p new int(0); // 自动识别类型大小并初始化为 0 *p 20; cout p , *p endl; delete p; // 释放单个变量 // 申请数组 int* arr new int[5]{1, 2, 3, 4, 5}; // 可以使用初始化列表 delete[] arr; // 释放数组需要使用 delete[]二、new 的三大优势特性C 语言 mallocC new大小计算手动计算sizeof(type) * n自动识别new type[n]类型转换需要强制转换(int*)自动返回正确类型初始化需要手动memset或循环赋值支持初始化器错误处理返回 NULL抛出bad_alloc异常三、new 的三种用法C 提供了三种不同形式的 new每种都有其特定的用途1. 关键字 new最常用// 申请单个变量并初始化 int* p1 new int(100); // 初始化为 100 int* p2 new int(); // 初始化为 0 int* p3 new int; // 未初始化值为随机 // 申请数组并初始化 int* arr1 new int[5]; // 未初始化 int* arr2 new int[5]{0}; // 全部初始化为 0 int* arr3 new int[5]{1, 2, 3}; // 前三个初始化为 1,2,3其余为 0 // 释放 delete p1; delete[] arr3;2. 运算符函数 operator newoperator new() 只负责申请内存空间不进行初始化类似于 C 语言的 malloc// operator new 只申请空间不初始化 int* p (int*)operator new(sizeof(int)); // 需要单独进行初始化 new(p) int(0); // 使用 placement new 初始化 *p 100; cout *p endl; // 释放内存 operator delete(p);特点只分配内存不调用构造函数返回 void*需要类型转换可以重载用于自定义内存分配策略3. 定位 newplacement new定位 new 在已分配的内存上构造对象// 先申请原始内存 int* p (int*)operator new(sizeof(int)); // 在指定内存位置上构造对象 new(p) int(0); // 定位 new 语法new(指针) 类型(初始值) // 使用对象 *p 100; // 手动调用析构函数如果需要 // p-~int(); // 对于基本类型不需要 // 释放内存 operator delete(p);定位 new 的应用场景内存池技术共享内存中的对象构造避免频繁的内存分配第三部分一维数组的动态内存管理一、使用 new 申请一维数组int main() { // 申请 5 个 int 类型的数组空间 int* arr2 new int[5]{2}; // new 数据类型[长度] 申请连续空间 for (int i 0; i 5; i) cout arr2[i] ; // 输出2 0 0 0 0 cout endl; // 释放连续空间必须使用 delete[] delete[] arr2; return 0; }重要提醒new[] 必须搭配 delete[] 使用使用 delete 而不是 delete[] 会导致未定义行为二、初始化规则// 不同的初始化方式 int* arr1 new int[5]; // 未初始化值不确定 int* arr2 new int[5](); // 值初始化为 0 int* arr3 new int[5]{0}; // 全部初始化为 0 int* arr4 new int[5]{1, 2, 3}; // 前三个为 1,2,3其余为 0 int* arr5 new int[5]{1, 2, 3, 4, 5}; // 全部指定第四部分多维数组的动态内存管理一、使用 new 申请二维数组C 支持直接使用 new 申请多维数组#include time.h #include stdlib.h int main() { // 申请 3 行 4 列的 int 类型二维数组 int(*arr3)[4] new int[3][4]{0}; // 数组指针接收 // 随机数初始化 srand(time(NULL)); for (int i 0; i 3; i) for (int j 0; j 4; j) { arr3[i][j] rand() % 100 1; } // 输出二维数组 for (int i 0; i 3; i) { for (int j 0; j 4; j) { cout *(*(arr3 i) j) ; } cout endl; } // 释放二维数组 delete[] arr3; return 0; }二、使用 operator new 实现多维数组int main() { // 使用 operator new 实现三维数组3行 x 4列 // 申请内存3 * 4 * sizeof(int) 字节 int(*arr)[4] (int(*)[4])operator new(3 * 4 * sizeof(int)); // 使用定位 new 初始化 new(arr) int[3][4]{0}; // 使用数组 for (int i 0; i 3; i) { for (int j 0; j 4; j) { cout *(*(arr i) j) ; } cout endl; } // 释放内存 operator delete(arr); return 0; }关键点解析int(*arr)[4]arr 是一个指针指向有 4 个 int 元素的数组operator new()只申请原始内存不进行初始化new(arr) int[3][4]{0}在已分配内存上构造二维数组并初始化为 0第五部分new 的错误处理机制一、C 语言的方式返回 NULLint* arr (int*)malloc(5 * sizeof(int)); if (arr NULL) { // 处理内存分配失败 return -1; }二、C 的方式抛出异常// new 申请空间失败后会抛出 std::bad_alloc 异常 try { int* p new int[1000000000]; // 可能失败 delete[] p; } catch (const std::bad_alloc e) { cout 内存分配失败: e.what() endl; } // 也可以使用 nothrow 版本返回 NULL int* p new(std::nothrow) int[1000000000]; if (p nullptr) { cout 内存分配失败 endl; }第六部分new/delete 与 malloc/free 的对比一、详细对比表特性malloc/freenew/delete所属C 标准库函数C 关键字/运算符类型安全返回 void*需强制转换返回正确类型指针大小计算手动计算字节数自动计算初始化不支持支持构造函数不会调用会调用对类对象析构函数不会调用会调用对类对象失败处理返回 NULL抛出 bad_alloc 异常内存大小调整支持 realloc不支持重载不可重载可以重载 operator new二、类对象的区别对于类对象new 和 delete 会自动调用构造和析构函数class Student { public: string name; int age; Student() : name(Unknown), age(0) { cout 构造函数被调用 endl; } ~Student() { cout 析构函数被调用 endl; } }; int main() { // malloc 不会调用构造函数 Student* s1 (Student*)malloc(sizeof(Student)); // new 会调用构造函数 Student* s2 new Student(); // free 不会调用析构函数 free(s1); // delete 会调用析构函数 delete s2; return 0; }总结一、new 的三种用法总结类型语法作用对应释放关键字 newnew int(0)申请初始化delete p关键字 new[]new int[5]{0}申请数组初始化delete[] poperator newoperator new(size)只申请内存operator delete(p)定位 newnew(p) int(0)在指定位置构造手动调用析构二、快速参考// 1. 关键字 new最常用 int* p1 new int(100); int* arr1 new int[10]{0}; delete p1; delete[] arr1; // 2. operator new底层分配 int* p2 (int*)operator new(sizeof(int)); operator delete(p2); // 3. 定位 new高级用法 int* p3 (int*)operator new(sizeof(int)); new(p3) int(100); operator delete(p3); // 4. 多维数组 int(*p4)[4] new int[3][4]{0}; delete[] p4;C 的动态内存管理是一个既基础又重要的话题。理解 new 和 delete 的三种不同形式不仅能帮助我们写出更正确的代码更能帮助我们理解 C 底层的内存管理机制。从最初的 malloc/free 到 new/delete再到现代 C 的智能指针C 一直在不断地完善内存管理的方式。掌握这些知识是写出高质量 C 代码的基础。

相关文章:

C++ 动态内存管理深度解析:new/delete 完全指南

引言在 C 语言中,我们使用 malloc()、calloc()、realloc() 和 free() 来管理动态内存。而 C 引入了全新的动态内存管理方式——new 和 delete。这不仅带来了语法上的简化,更重要的是引入了类型安全和初始化的概念。在学习过程中,我对 new 的理…...

文书妙笔专为公文写作打造,让写材料效率翻倍

不同于市面上通用型写作工具,文书妙笔每一项功能都为公文写作量身定制,真正实现“写材料效率翻倍”。作为专为公文写作打造的平台,平台内置40W优质公文范文库,每日持续更新,更整合了最新政策表述、基层工作案例和规范金…...

Oracle数据库进程体系结构概述

Oracle数据库进程体系结构概述 Oracle属于多进程体系架构,它由多个后台进程组成,每个后台进程完成特定的维护任务,进程之间互相协助,最终共同完成数据库所需的维护任务。 本文讲述的内容: 1、进程类型 2、Oracle两种服…...

苍穹外卖day10(黑马程序员)

苍穹外卖 day10 笔记 WebSocket 什么是 WebSocket WebSocket 是一种全双工的网络通信方式:客户端和服务器建立连接之后,双方都可以随时主动给对方发消息,不必像传统网页那样「每次都要重新发起一次请求」。 可以把它理解成: HTTP&…...

2026经管大洗牌!只会记账/理论已死,再不考这10个证,迟早被AI取代!

2026经管行业变革与核心证书指南随着AI技术的快速发展,传统经管岗位面临巨大挑战。单纯掌握记账或理论知识的从业者可能面临淘汰风险。以下为未来五年内最具价值的10项认证,帮助从业者保持竞争力。CDA数据分析师证书的核心优势CDA数据分析师证书由国际数…...

WaveTools:解决鸣潮玩家性能优化与数据管理痛点的开源工具

WaveTools:解决鸣潮玩家性能优化与数据管理痛点的开源工具 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools是一款专为《鸣潮》PC玩家设计的开源辅助工具,集成性能优化、账…...

Linux内核设计哲学:你我承载力的艺术(续)

第七部:设备驱动——与不完美的世界和解7.1 你不是主人,你是仆人设备驱动是内核中最“卑微”的组件。它不和用户直接打交道,不参与核心决策,甚至不拥有任何资源。它只是硬件的翻译官——把内核的标准请求翻译成硬件能懂的指令&…...

Thorium浏览器:为什么这个基于Chromium的优化版本能解决你90%的性能痛点?

Thorium浏览器:为什么这个基于Chromium的优化版本能解决你90%的性能痛点? 【免费下载链接】thorium Chromium fork named after radioactive element No. 90. Source code and Linux releases. Windows/MacOS/ARM builds served in different repos, lin…...

5个维度教你掌握游戏自动化与效率工具开发

5个维度教你掌握游戏自动化与效率工具开发 【免费下载链接】JX3Toy 一个自动化测试DPS的小工具 项目地址: https://gitcode.com/GitHub_Trending/jx/JX3Toy 在游戏开发与玩家体验优化领域,游戏脚本开发正成为提升效率的关键技术。本文将系统介绍一款开源项目…...

水箱水位监测控制电路 Multisim 仿真探索

Multisim仿真文件 水箱水位监测控制电路报告 包含:说明书,Multisim10电路源文件,仿真电路等 仿真效果: 1.在水箱内的不同高度安装3根金属棒,以感知水位变化情况, 液位分1,2,3档&…...

山西口碑好的实体店获客公司哪家可靠

在山西,实体店主们都在为如何有效获客而烦恼。随着市场竞争的加剧,选择一家可靠的获客公司至关重要。今天,我们就来探讨一下山西口碑好的实体店获客公司,重点介绍中谷云(厦门)大数据科技有限公司&#xff0…...

覆盖更远、组网更稳:基于 EFR32BG21 的智能家居与物联网 BLE Mesh 无线模块方案

智能家居与物联网设备越来越多,但真正决定体验上限的往往不是“有没有连上网”,而是信号能不能到、掉线后能不能自愈、多设备同时在线是否还稳定。单靠点对点蓝牙,很容易在隔墙、远距离、多节点场景里碰到瓶颈;而把低功耗蓝牙与 M…...

5分钟掌握ImStudio:免费高效的实时GUI布局设计终极方案

5分钟掌握ImStudio:免费高效的实时GUI布局设计终极方案 【免费下载链接】ImStudio Real-time GUI layout designer for Dear ImGui 项目地址: https://gitcode.com/gh_mirrors/im/ImStudio 你是否曾经为调试用户界面而反复编译代码?是否厌倦了在代…...

不只是“生成一张图“:2026年6款真正改变设计工作流的AI界面工具深度测评

AI界面生成工具正在经历从"生成单张界面"到"生成完整产品体验"的代际跃迁。本文深度拆解 UXbot、Figma Make、Google Stitch、Flowstep、Visily AI 和 Moonchild 共6款2026年代表性工具——从设计稿生成到原生代码输出,覆盖完整的产品交付能力谱…...

如何快速修复ROG游戏本色彩配置文件丢失问题:G-Helper终极指南

如何快速修复ROG游戏本色彩配置文件丢失问题:G-Helper终极指南 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, S…...

AI生成教材新玩法,低查重让你的教材更有竞争力!

教材的格式问题常常让编写者感到困惑。比如,标题应该选择多大字号?参考文献是依据GB/T7714还是按照某些出版机构的标准?习题的排版又应选择单栏还是双栏?各种不同的要求让人感到眼花缭乱,而手动调整不仅耗时费力&#…...

做对这三步,拥有一个聪明的智能问数与分析Agent

这两年,智能问数与分析,几乎已经成了 ToB Agent 里最容易出圈的“爆款场景”。原因不难理解。相比很多还停留在演示层、流程层的 AI 应用,智能问数更接近企业管理者最直接的需求:我有问题,系统能不能立刻给我答案&…...

本科论文知网AI率高的原因和解决方法全在这里

知网AIGC检测出来AI率高,很多同学第一反应是"我没有全程用AI写啊,为什么这么高?"这个问题确实需要好好解释一下——知网检测到的AI率高,未必是因为你完全靠AI写的。 知网AIGC检测是怎么工作的 知网的AIGC检测系统会分…...

本科论文降AI率花多少钱合适?各档工具对比

每年毕业季都有同学问:降AI率要花多少钱?买个工具值不值?这篇把费用账算清楚,让你心里有数。 先算清楚你实际需要处理多少字 很多人有个误区,以为论文AI率30%就要处理30%的字数。实际上不是的。 实际需要处理的字数…...

**发散创新:基于Python与OpenCV的智能交通流量实时监测系统设计

发散创新:基于Python与OpenCV的智能交通流量实时监测系统设计与实现 在智慧城市建设不断深化的背景下,智能交通系统(ITS) 正成为城市治理现代化的重要突破口。传统的交通信号控制多依赖固定时长或人工经验判断,难以应对…...

数仓实习实战|医疗报表电话指标缺失,完整上游排查思路

今天碰到一个问题:患者档案里明明有联系电话,但是最终报表展示的时候,这个字段就是空的。跟着师哥一步步排查下来,思路清晰了很多,也把完整的排查逻辑整理了一下,以后遇到类似问题可以直接参考一、问题场景…...

开篇:高并发下MySQL主从延迟的挑战与诊断全景图

开篇:高并发下MySQL主从延迟的挑战与诊断全景图 凌晨三点,监控告警炸了。主库QPS冲到两万八,从库延迟曲线像坐了火箭——三分钟前还是秒级延迟,现在稳定在三百秒高位。业务侧已经出现数据不一致的客诉,运营群开始@全体成员。你揉着发红的眼睛,连上从库执行SHOW SLAVE STA…...

[WP]vulhub-dc1 flag全收集,靶机通关writeup超级详细,附带知识点讲解

2026/3/28 前言/提示: 本次记录的背景是作者本人积累2年多的基础知识,但是从来没有打过这种集成环境的靶机,所以仅供个人参考,尽管真的很想分享一些自己的思路也许能帮助读者,但是本次记录也大概率会出现手法惊奇&am…...

RHCSA 认证必备:目录文件的管理

目录 一、创建目录 (1)格式 (2)参数 (3)示例 二、查看目录文件 1、查看目录文件 2、统计命令 3、编辑与删除 a.编辑目录文件 b.删除目录文件 一、创建目录 (1)格式 mkdi…...

2026届毕业生推荐的五大AI科研神器实测分析

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在运用人工智能辅助写作这个行为当中,所生成的内容常常带有十分明显的机械感。所…...

2025届必备的六大AI科研神器实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 专门用于降低重复率的网站,在学术范畴里,是作为辅助学术写作的工具而…...

风冷机房温湿度数据采集解决方案

对部分气候干旱的地区来说,使用风冷技术对数据机房进行冷却是比较合适的方案,但高能耗问题仍需要避免与管控,要求环境温湿度与散热效率进行合理分配。对此,物通博联提供温湿度数据采集到机房管理平台的解决方案。 需求如下 温湿度…...

2025届最火的十大AI写作工具实测分析

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在学术写作这个特定的场景之内,精确地挑选恰当的AI论文平台,能够极其…...

2025届最火的五大降AI率平台横评

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 一款基于自然语言处理技术的智能工具,是AI写作软件,它能够辅助用户自…...

计算机毕业设计:Python汽车销量智能可视化与预测系统 Flask框架 可视化 机器学习 AI 大模型 大数据(建议收藏)✅

博主介绍:✌全网粉丝50W,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,…...