news 2026/9/2 18:12:41

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/9/1 23:25:32

so-vits-svc F0预测器深度指南:如何选择最适合你的基频提取方案

作为一名语音转换开发者,你是否曾经在面对Crepe、RMVPE、FCPE三种F0预测器时感到选择困难?今天,让我们一起来深入解析so-vits-svc项目中的这些核心组件,帮你做出明智的技术决策。 【免费下载链接】so-vits-svc 项目地址: https…

作者头像 李华
网站建设 2026/9/2 23:35:05

Electron API演示应用中文版:从入门到精通的完整指南

Electron API演示应用中文版:从入门到精通的完整指南 【免费下载链接】electron-api-demos-Zh_CN 这是 electron-api-demos 的中文版本, 更新至 v2.0.2 项目地址: https://gitcode.com/gh_mirrors/el/electron-api-demos-Zh_CN Electron API演示应用中文版是…

作者头像 李华
网站建设 2026/9/3 0:28:58

kkFileView移动端深度适配指南:打造极致预览体验

kkFileView移动端深度适配指南:打造极致预览体验 【免费下载链接】kkFileView Universal File Online Preview Project based on Spring-Boot 项目地址: https://gitcode.com/GitHub_Trending/kk/kkFileView 在移动优先的时代,文档预览不再局限于…

作者头像 李华
网站建设 2026/9/2 23:35:14

3D场景格式终极指南:OpenUSD与glTF如何选择与快速转换

3D场景格式终极指南:OpenUSD与glTF如何选择与快速转换 【免费下载链接】OpenUSD Universal Scene Description 项目地址: https://gitcode.com/GitHub_Trending/ope/OpenUSD 在当今3D内容创作领域,选择合适的场景格式直接影响项目的成功与否。无论…

作者头像 李华
网站建设 2026/9/2 8:35:35

WordPress终极学习指南:从零基础到专业级技能提升

WordPress终极学习指南:从零基础到专业级技能提升 【免费下载链接】WordPress中文完全教程pdf下载 《WordPress中文完全教程》是一本全面而深入的电子书,适合从初学者到高级开发者的所有读者。从基础的安装与配置,到高级的主题定制与插件应用…

作者头像 李华
网站建设 2026/9/3 0:21:49

K8S-Pod资源对象

一、概述 Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。Pod(就像在鲸鱼荚或者豌豆荚中)是一组(一个或多个) 容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的容器总是并置&…

作者头像 李华