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 的区别

特性 calloc malloc
函数原型 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指针,但实际使用这些内存时可能会导致系统交换或程序崩溃。真正的限制是虚拟地址空间大小和交换空间大小,而不仅仅是物理内存大小。

相关推荐
vKd0Ff21L几秒前
如何在Dev-C++中设置TDM-GCC为默认编译器第九十一篇
java·jvm·c++
cany10008 分钟前
C++ -- 型号比对和constexpr
c++
楼田莉子8 分钟前
C++17新特性:结构化绑定/inline变量/if相关的变化
c++·后端·学习
翎沣14 分钟前
C++面向对象三大特性
开发语言·c++
Chen_harmony14 分钟前
【习题02】打印菱形
c语言
无限进步_25 分钟前
【C++】C++11的类功能增强与STL变化
java·前端·数据结构·c++·后端·算法
小鱼️遨游42 分钟前
openCPU SDK 安装和第一次编译方法、注意事项
c++·opencpu·ml307
basketball61643 分钟前
C++ iostream 完全指南:从 cin/cout 到流式编程的奥秘
开发语言·c++
Hua-Jay1 小时前
OpenCV联合C++/Qt 学习笔记(二十二)----相机模型与投影及单目相机标定
c++·笔记·qt·opencv·学习·计算机视觉
计算机安禾2 小时前
【c++面向对象编程】第37篇:面向对象设计原则(一):单一职责与开闭原则
开发语言·c++·开闭原则