news 2026/6/21 6:34:27

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/6/19 22:39:42

大模型应用:RAG与向量数据库结合Ollama调用模型深度融合全解析.27

一、引言 通过多篇博文我们也反复介绍说明了大模型知识滞后、生成幻觉成为制约智能问答、企业知识库等场景落地的核心痛点,检索增强生成(RAG)技术通过“外部知识检索 LLM 生成” 的模式,为解决这些问题提供了关键思路&#xff0c…

作者头像 李华
网站建设 2026/6/14 2:16:06

Xiaomi MiMo-V2-Flash:高效推理、代码与 Agent 基座模型

小米在2025年12月17日正式发布了新一代大模型 Xiaomi MiMo-V2-Flash。该模型定位为高效推理、代码生成和智能体(Agent)应用的基础模型,其核心特点是在保持顶尖性能的同时,实现了极高的推理效率和极低的使用成本。 为了方便你快速…

作者头像 李华
网站建设 2026/6/20 16:36:54

Legado书源开发终极指南:从JSONPath到JavaScript的完整解决方案

Legado书源开发终极指南:从JSONPath到JavaScript的完整解决方案 【免费下载链接】legado Legado 3.0 Book Reader with powerful controls & full functions❤️阅读3.0, 阅读是一款可以自定义来源阅读网络内容的工具,为广大网络文学爱好者提供一种方…

作者头像 李华
网站建设 2026/6/19 11:57:26

Flutter 结合 shared_preferences 2.5.4 实现本地轻量级数据存储

在日常 Flutter 开发中,经常会遇到需要存储用户偏好设置、登录状态、简单配置项等轻量级数据的场景。这类数据无需复杂的数据库结构,但要求读写高效、跨平台兼容且接入成本低。此前我尝试过手动封装原生存储逻辑(如 Android 的 SharedPrefere…

作者头像 李华
网站建设 2026/6/20 22:27:34

轻松掌控微信通知:Electronic WeChat个性化设置全攻略

轻松掌控微信通知:Electronic WeChat个性化设置全攻略 【免费下载链接】electronic-wechat :speech_balloon: A better WeChat on macOS and Linux. Built with Electron by Zhongyi Tong. 项目地址: https://gitcode.com/gh_mirrors/el/electronic-wechat 还…

作者头像 李华
网站建设 2026/6/18 2:04:37

告别数据库连接噩梦:Druid连接池容器化实战全攻略

🚀 还在为数据库连接超时、连接池耗尽而头疼吗?作为阿里云DataWorks团队出品的明星产品,Druid连接池在容器化部署中展现出了惊人的稳定性和监控能力。今天我们就来聊聊如何让这个"为监控而生"的连接池在你的容器环境中大放异彩&…

作者头像 李华