C++内存管理

作者:孬甭_日期:2026/7/11

目录

1 · C / C++ 内存分布

2 · C++内存管理方式

2 - 1 · new / delete 操作内置类型

2 - 2 · new / delete 操作自定义类型

3 · operator new 和 operator delete 函数

4 · new 和 delete 的实现原理

4 - 1 · 内置类型

4 - 2 · 自定义类型

5 · 定位new

6 · new / delete 与 malloc / free 的区别


1 · C / C++ 内存分布

简单介绍一下:

  1. 又叫堆栈,装载非静态局部变量/函数参数/返回值等等,栈是向下增长的。
  2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口
    创建共享共享内存,做进程间通信。
  3. 用于程序运行时动态内存分配,堆是可以上增长的。
  4. **数据段——**存储全局数据和静态数据。
  5. 代码段——可执行的代码/只读常量。

2 · C++内存管理方式

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


2 - 1 · new / delete 操作内置类型

1// 动态申请一个int类型的空间
2int* ptr4 = new int;
3
4// 动态申请一个int类型的空间并初始化为10
5int* ptr5 = new int(10);
6
7// 动态申请10个int类型的空间
8int* ptr6 = new int[3];
9
10//释放空间
11delete ptr4;
12delete ptr5;
13delete[] ptr6;

**注意:**申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用

new[]和delete[],需要匹配起来使用


2 - 2 · new / delete 操作自定义类型

new/delete 和 malloc/free最大区别是 new/delete对于 自定义类型 除了开空间还会调用构造函数和析构函数,而对于内置类型,这两套并无太大区别。


3 · operator new 和 operator delete 函数

new和delete是用户进行动态内存申请和释放的操作符operator new 和operator delete

系统提供的全局函数new在底层调用operator new全局函数来申请空间,delete在底层通过

operator delete全局函数来释放空间。

operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间失败,尝试执行空间不足应对措施,如果用户设置了应对措施,则继续申请,否则抛异常。

1void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
2{
3    // try to allocate size bytes
4    void *p;
5    while ((p = malloc(size)) == 0)
6    if (_callnewh(size) == 0)
7    {
8        // report no memory
9        // 如果申请内存失败了,这里会抛出bad_alloc 类型异常
10        static const std::bad_alloc nomem;
11        _RAISE(nomem);
12    }
13    return (p);
14}

可以看出:operator new 的底层是 malloc。

operator delete: 该函数最终是通过free来释放空间的

1void operator delete(void* pUserData)
2{
3	_CrtMemBlockHeader* pHead;
4
5	RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
6
7	if (pUserData == NULL)
8		return;
9
10	_mlock(_HEAP_LOCK); /* block other threads */
11	__TRY
12
13		/* get a pointer to memory block header */
14		pHead = pHdr(pUserData);
15
16	/* verify block type */
17	_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
18
19	_free_dbg(pUserData, pHead->nBlockUse);
20
21	__FINALLY
22		_munlock(_HEAP_LOCK); /* release other threads */
23	__END_TRY_FINALLY
24
25		return;
26}

其中核心操作是 _free_dbg(pUserData, pHead->nBlockUse),那么这个又是什么呢?free的实现其实是一个宏:

1//free的实现
2
3#define free(p) _free_dbg(p, _NORMAL_BLOCK)

小结论: operator new 实际也是通过malloc来申请空间,如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。operator delete 最终是通过free来释放空间的


4 · new 和 delete 的实现原理

4 - 1 · 内置类型

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


4 - 2 · 自定义类型

new的原理:

  1. 调用operator new函数申请空间
  2. 在申请的空间上执行构造函数,完成对象的构造

delete的原理:

  1. 在空间上执行析构函数,完成对象中资源的清理工作
  2. 调用operator delete函数释放对象的空间

new[ ]的原理:

  1. 调用operator new[ ]函数,在operator new[ ]中实际调用operator new函数完成N个对
    象空间的申请
  2. 在申请的空间上执行N次构造函数

delete[ ]的原理:

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

5 · 定位new

定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象

使用格式:

new (place_address) type 或者 new (place_address) type(initializer-list)

其中place_address必须是一个指针, initializer-list 是类型的初始化列表

使用场景:定位new表达式在实际中一般是配合内存池使用。因为内存池分配出的内存没有初始化,所以如果是自定义类型的对象,需要使用new的定义表达式进行显示调构造函数进行初始化。

1class A
2{
3public:
4	A(int a = 0)
5		: _a(a)
6	{
7		//...
8	}
9
10	~A()
11	{
12		//...
13	}
14private:
15	int _a;
16};
17
18int main()
19{
20	A* p1 = (A*)malloc(sizeof(A));
21	new(p1)A; // 注意:如果A类的构造函数有参数时,此处需要传参
22
23	p1->~A();
24	free(p1);
25
26	A* p2 = (A*)operator new(sizeof(A));
27	new(p2)A(10);
28
29	p2->~A();
30	operator delete(p2);
31
32	return 0;
33}

6 · new / delete 与 malloc / free 的区别

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

不同点有:

  1. malloc和free是函数,new和delete是操作符
  2. malloc申请的空间不会初始化,new可以初始化
  3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可,
    如果是多个对象,[ ]中指定对象个数即可
  4. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型
  5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需
    要捕获异常
  6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new
    在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成
    空间中资源的清理释放

以上内容如有错误或不准确之处,欢迎指出,或者你有更好的想法,也欢迎交流。


C++内存管理》 是转载文章,点击查看原文


相关推荐


EventBus → SharedFlow
plainGeek2026/7/3

EventBus → SharedFlow 老写法(Java + EventBus) // 事件定义 public class LoginEvent { private long userId; public LoginEvent(long userId) { this.userId = userId; } public long getUserId() { return userId; } } // 发送 EventBus.getDefault().post(new


【Linux基础】初始Linux
键盘敲碎了雾霭2026/6/25

🎬 博主名称:键盘敲碎了雾霭 🔥 个人专栏: 《C语言》《数据结构》 《C++》 《Matlab》 《Python》 《Linux》 ⛺️指尖敲代码,雾霭皆可破 文章目录 一、Linux发展史1.1 UNIX发展历史1.2 Linux发展历史 二、开源三、应用现状四、发行版本五、os概念六、使用XShell远程登录Linux6.1 会话方式登录6.2 命令行登录6.3 多用户使用 文章结语 一、Linux发展史 要说Linux,还


【Java基础】链表的七十二变——从LRU缓存到手写浏览器前进后退
zzz_23682026/6/16

链表的七十二变——从LRU缓存到手写浏览器前进后退 写在前面的目录 一、真实面试真题引入 二、链表的底层解构——不止是 next 指针   2.1 单向链表:最简单的链式结构   2.2 双向链表:前后眼的设计哲学   2.3 链表反转四步拆解   2.4 哨兵节点——让边界消失   2.5 跳表——给链表加个索引 三、"纯手工、零依赖"原创案例实战   3.1 浏览器前进后退——双向链表实现标签页导航   3.2 LRU 缓存淘汰——HashMap + 双向链表的 O(1) 魔法 四、


安全第一与合规治理:魔芋 AI 正式发布企业级大模型网关 Mai Gateway
青莲网络2026/6/9

在现代企业业务创新中,人工智能(AI)正逐步成为关键驱动力。随着大语言模型的发展,企业应用架构已从传统的微服务、云原生架构,加速向AI原生架构演进。在此过程中,企业在AI集成、系统稳定性、安全合规及管理复杂性方面面临诸多挑战。 为了帮助企业安全、高效地落地 AI 应用,魔芋 AI(MoYu AI)正式推出重磅核心产品——Mai Gateway(大模型网关)。作为企业 AI 应用与模型服务、工具及其他 Agent 之间的核心连接组件,Mai Gateway 通过提供协议转换、安全防护、流量治理和


C++与 Lua的交互
kebeiovo2026/6/1

适用场景:游戏服务端、客户端热更新、业务逻辑解耦、C++高性能底层+Lua灵活业务架构 核心定位:C++负责高性能底层(网络、内存池、epoll、计算),Lua负责业务逻辑、配置解析、热更新,二者结合是游戏行业主流生产方案。 一、交互原理 1.1 交互核心载体 所有C++与Lua的交互,全部围绕 Lua虚拟机(lua_State) 实现; Lua 是编译型 + 解释型的嵌入式脚本语言,自身不依赖独立进程运行,它的代码最终交由 Lua 虚拟机(Lua VM) 执行。 Lua 虚拟机本质


营销数据分析:如何利用IP归属地识别和规避虚假流量
TechWayfarer2026/5/12

一、流量作弊:程序化广告的隐形黑洞 程序化广告已成为数字营销的主流投放方式,但伴随着海量流量而来的,是日益猖獗的虚假流量产业链。根据中国互联网络信息中心发布的数据,截至2025年6月,我国网民规模已达11.23亿人,互联网普及率达79.7%。庞大的用户基数为黑灰产提供了可乘之机。 在程序化广告交易中,虚假流量问题尤为突出。据行业实测数据显示,某DSP平台日均处理超过50亿次广告竞价请求,其中约30%的流量来自数据中心IP或代理IP,这些流量中真正产生转化的不足0.5%,却消耗了平台近四分之一


03ab-PyTorch安装教程 📚
郑恩赐2026/5/3

03ab-PyTorch安装教程 📚 章节阅读路线图 🗺️ flowchart LR A["1. 概述"]:::concept --> B["2. 安装前准备"]:::setup B --> C["3. CPU版本安装"]:::cpu C --> D["4. GPU版本安装"]:::gpu D --> E["5. 验证安装"]:::verify classDef concept fill:#e3f2fd,stroke:#1565c0 clas


廉价 VPS 越来越少,不是没活动,是真的没货了
小墨同学boy2026/4/24

很多小伙伴都来问我什么时候 DMIT 会有活动,特价款什么时候补货,其实我自己都不知道,甚至别说活动款,连很多廉价 VPS 厂商都缺货了。 今天早上一起来,本来开开心心的看监控站点的内容,结果发现 Racknerd 的特价套餐基本全线缺货,这还不是第一次了。前段时间 CloudCone 的优惠套餐挂着缺货,这两家向来是廉价 VPS 圈的地板价代表,现在同时没货。翻了一圈,我才意识到不是商家不想做活动,是真的没货可卖。 不是没活动,是货快没了 不知道有没有 mjj 和我一样,过去两三个月一直盯


整洁架构三连问:是什么,怎么做,为什么要用
暖阳_2026/4/15

整洁架构问答 Q1:什么是整洁架构? 由 Robert C. Martin(Uncle Bob)提出,核心思想:业务逻辑独立于框架、UI、数据库等外部细节,依赖关系只能从外层指向内层。 四层结构 ┌─────────────────────────────────┐ │ Frameworks & Drivers │ ← Web、数据库、UI(最易变) │ ┌─────────────────────────┐ │ │ │ Interface Adapters


Flutter 框架跨平台鸿蒙开发 - 跟生活有关的心情日记应用开发
小雨天気.2026/4/7

欢迎加入开源鸿蒙跨平台社区: https://openharmonycrossplatform.csdn.net 一、项目概述 运行效果图 1.1 应用简介 心情日记是一款专注于情感记录与追踪的移动应用,为用户提供一个私密、便捷的空间记录每日心情变化。在快节奏的现代生活中,人们常常忽略了对自身情绪的关注与觉察,本应用帮助用户追踪情绪轨迹,从而更好地了解自己、关爱自己。 应用支持八种心情类型选择,配以表情符号与主题色彩,让情绪表达更加直观生动。日记撰写支持标题、内容、

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 聚合阅读