news 2026/10/30 2:48:26

C/C++ 内存分配函数详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C/C++ 内存分配函数详解

一、new 和 malloc 的区别

特性new / delete (C++)malloc / free (C)
语言C++ 运算符C 标准库函数
返回类型返回具体类型指针返回void*,需要强制转换
分配大小自动计算类型大小需要手动计算字节数
构造函数调用构造函数不调用构造函数
析构函数调用析构函数不调用析构函数
内存不足抛出std::bad_alloc异常返回NULL
重载可以重载operator new不能重载
初始化可以初始化(如new int(5))不进行初始化
数组支持new[]和delete[]需要手动计算数组大小
类型安全类型安全类型不安全
使用示例int* p = new int(10);int* p = (int*)malloc(sizeof(int));
释放delete p;/delete[] arr;free(p);

二、calloc 和 malloc 的区别

特性callocmalloc
函数原型void* calloc(size_t num, size_t size);void* malloc(size_t size);
参数两个参数:元素个数和每个元素大小一个参数:总字节数
初始化自动初始化为0不初始化(内容随机)
内存计算自动计算总大小:num * size需要手动计算总大小
性能稍慢(因为要初始化)稍快(不初始化)
使用场景需要零初始化的数组或结构体不需要初始化或后续会覆盖的情况

三、在1G内存的计算机中能否malloc(1.2G)?为什么?

实际安装在计算机中的RAM内存(1GB)。操作系统为每个进程提供的虚拟地址空间(通常很大,如32位系统4GB,64位系统更大),地址空间布局为

32位进程的典型地址空间布局(4GB): ┌─────────────────┐ 0xFFFFFFFF │ 内核空间 │ (1GB或2GB) ├─────────────────┤ │ │ │ 栈(stack) │ ← 向下增长 ├─────────────────┤ │ ... │ ├─────────────────┤ │ 堆(heap) │ ← 向上增长 ├─────────────────┤ │ BSS段(.bss) │ 未初始化全局变量 ├─────────────────┤ │ 数据段(.data) │ 已初始化全局变量 ├─────────────────┤ │ 代码段(.text) │ 程序代码 └─────────────────┘ 0x00000000

Linux允许分配超过物理内存+交换空间的内存。

由于交换空间(Swap Space),当物理内存不足时,操作系统会将一些不常用的物理页面移动到磁盘上的交换空间,从而腾出物理内存给需要的页面。当程序再次访问被换出的页面时,操作系统会将其从磁盘换入物理内存(可能需要换出其他页面)。因此,1.2G的虚拟内存中,只有一部分(最近被访问的)放在物理内存中,其余部分可能放在交换空间中。所以理论上可以分配。

# Linux查看交换空间 $ free -h total used free shared buff/cache available Mem: 7.7G 2.3G 3.9G 200M 1.5G 4.9G Swap: 2.0G 0B 2.0G # ← 交换空间 # Windows页面文件 # 在C:\pagefile.sys(隐藏系统文件)

调用malloc(1.2G)可能成功返回非NULL指针,但实际使用这些内存时可能会导致系统交换或程序崩溃。真正的限制是虚拟地址空间大小和交换空间大小,而不仅仅是物理内存大小。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/29 10:13:48

Leon Sans字体引擎:零代码基础打造炫酷文字动画

Leon Sans字体引擎:零代码基础打造炫酷文字动画 【免费下载链接】leonsans Leon Sans is a geometric sans-serif typeface made with code in 2019 by Jongmin Kim. 项目地址: https://gitcode.com/gh_mirrors/le/leonsans 还在为网页文字效果单调而烦恼吗&…

作者头像 李华
网站建设 2026/10/29 12:30:26

Obsidian网页剪藏完整指南:从零开始的高效知识管理方案

Obsidian网页剪藏完整指南:从零开始的高效知识管理方案 【免费下载链接】obsidian-clipper Highlight and capture the web in your favorite browser. The official Web Clipper extension for Obsidian. 项目地址: https://gitcode.com/gh_mirrors/obsidia/obsi…

作者头像 李华
网站建设 2026/10/30 4:02:10

终极指南:如何在不受支持的设备上免费启用Sidecar功能

终极指南:如何在不受支持的设备上免费启用Sidecar功能 【免费下载链接】free-sidecar Enable Sidecar on Unsupported iPads and Macs running iPadOS 13 and macOS Catalina 项目地址: https://gitcode.com/gh_mirrors/fr/free-sidecar 你是否曾经羡慕那些拥…

作者头像 李华
网站建设 2026/10/29 14:32:06

当 Gemini 3 + Nano Banana Pro 预判了你的天才,你还是创作者吗?

在古典的创作语境中,“灵感”被视为一种带有随机性的、神圣的突变。它源于深夜的一次沉思、窗外的一阵细雨,或者是大脑神经元一次不可预测的错误放电。这种“不可控性”曾是人类创作者最后的尊严——它证明了创作是主观意志的产物。 然而,20…

作者头像 李华
网站建设 2026/10/29 19:32:23

GitHub星标9.7k!这款开源笔记神器用AI重新定义知识管理

note-gen:AI驱动的开源笔记神器,碎片化知识整理利器 在信息碎片化时代,让AI成为你的第二大脑,轻松构建个人知识体系 小伙伴们,在日常工作和学习中,我们经常面临信息碎片化的困扰:重要会议记录、…

作者头像 李华