news 2026/4/18 12:08:54

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/4/17 13:30:38

yazi终端文件管理器:3分钟上手极速文件预览新体验

还在为终端中频繁切换应用查看文件内容而烦恼吗?每次查看压缩包都要先解压,预览PDF必须打开外部阅读器?yazi终端文件管理器用革命性的滚动预览功能,让你在终端内一站式查看所有类型文件,效率提升300%! 【免…

作者头像 李华
网站建设 2026/4/17 6:12:06

PVNet 6DoF姿态估计深度解析:从技术原理到实战应用

PVNet 6DoF姿态估计深度解析:从技术原理到实战应用 【免费下载链接】clean-pvnet Code for "PVNet: Pixel-wise Voting Network for 6DoF Pose Estimation" CVPR 2019 oral 项目地址: https://gitcode.com/gh_mirrors/cl/clean-pvnet PVNet像素级投…

作者头像 李华
网站建设 2026/4/18 3:35:56

Magenta Studio:AI音乐创作的终极指南与深度技术解析

Magenta Studio:AI音乐创作的终极指南与深度技术解析 【免费下载链接】magenta-studio Magenta Studio is a collection of music plugins built on Magenta’s open source tools and models 项目地址: https://gitcode.com/gh_mirrors/ma/magenta-studio 当…

作者头像 李华
网站建设 2026/4/18 3:37:35

AffectNet表情识别数据集:完整下载与使用指南

AffectNet表情识别数据集:完整下载与使用指南 【免费下载链接】AffectNet数据集资源下载说明 AffectNet数据集是一个专为表情识别研究设计的大规模资源,包含丰富的表情标签,为开发者和研究者提供了宝贵的实验材料。通过简单的网盘下载&#x…

作者头像 李华
网站建设 2026/4/18 3:33:50

C语言之约瑟夫

题目描述2k 个人站成一圈,从某个人开始数数,每次数到 m 的人就被杀掉,然后下一个人重新开始数,直到最后只剩一个人。现在有一圈人,k 个好人站在一起,k 个坏人站在一起。从第一个好人开始数数。你要确定一个…

作者头像 李华
网站建设 2026/4/18 3:35:53

Champ开源治理实战:构建可持续的技术创新生态系统

在当今快速发展的开源世界中,如何平衡技术创新与社区协作成为项目成功的关键。Champ开源项目通过实践验证的治理框架,为技术管理者和开源爱好者提供了一套可操作的解决方案。本文将深入解析Champ如何通过模块化架构、标准化流程和激励体系,构…

作者头像 李华