news 2026/4/15 4:30:09

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/14 12:11:25

如何在浏览器中精准控制AI输出?WebLLM日志处理器的5大实战技巧

如何在浏览器中精准控制AI输出?WebLLM日志处理器的5大实战技巧 【免费下载链接】web-llm 将大型语言模型和聊天功能引入网络浏览器。所有内容都在浏览器内部运行,无需服务器支持。 项目地址: https://gitcode.com/GitHub_Trending/we/web-llm 当你…

作者头像 李华
网站建设 2026/4/13 23:07:04

Ascend C算子开发“第一行代码“:从环境配置到Hello World核函数

🎯 摘要 在昇腾AI生态中,Ascend C算子开发是释放NPU硬件潜力的核心技术路径。本文基于13年异构计算实战经验,首次系统化呈现从零环境配置到完整算子部署的全链路实战指南。通过手把手构建向量加法(VecAdd)算子&#x…

作者头像 李华
网站建设 2026/4/9 23:39:08

嵌入式单目深度估计实战指南:FastDepth让AI视觉触手可及

嵌入式单目深度估计实战指南:FastDepth让AI视觉触手可及 【免费下载链接】fast-depth ICRA 2019 "FastDepth: Fast Monocular Depth Estimation on Embedded Systems" 项目地址: https://gitcode.com/gh_mirrors/fa/fast-depth 想要在嵌入式设备上…

作者头像 李华
网站建设 2026/4/15 8:07:55

YOLOv9模型性能分析实战指南:从诊断到优化的完整流程

YOLOv9模型性能分析实战指南:从诊断到优化的完整流程 【免费下载链接】yolov9 项目地址: https://gitcode.com/GitHub_Trending/yo/yolov9 YOLOv9作为目标检测领域的最新突破,其性能评估与优化对开发者至关重要。本文将采用创新的"问题诊断…

作者头像 李华
网站建设 2026/4/15 8:06:00

如何用AI工具将特征工程效率提升10倍?

如何用AI工具将特征工程效率提升10倍? 【免费下载链接】RD-Agent Research and development (R&D) is crucial for the enhancement of industrial productivity, especially in the AI era, where the core aspects of R&D are mainly focused on data and…

作者头像 李华