C语言内存管理函数详解:mmap、munmap、malloc与free
在C语言编程中,内存管理是核心技能之一。本文将全面介绍C语言中用于内存管理的关键函数,包括mmap、munmap、malloc和free,并详细解释它们的工作原理、使用场景及最佳实践。同时,我们也会列举其他相关的内存管理函数,帮助开发者全面掌握C语言内存管理技术。
一、mmap与munmap:内存映射函数
1. mmap函数详解
mmap
(memory map)是Unix/Linux系统下的一个系统调用,用于将文件或设备映射到内存中,或者创建匿名内存映射。
函数原型:
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
参数说明:
addr
:建议映射起始地址,通常设为NULL让系统自动选择length
:映射区域的长度prot
:内存保护标志,可以是以下组合:PROT_READ
:页内容可读PROT_WRITE
:页内容可写PROT_EXEC
:页内容可执行PROT_NONE
:页不可访问
flags
:映射对象的类型和映射选项:MAP_SHARED
:与其他进程共享此映射MAP_PRIVATE
:创建写时拷贝的私有映射MAP_ANONYMOUS
:创建不与文件关联的匿名映射MAP_FIXED
:使用指定的映射起始地址
fd
:要映射的文件描述符(匿名映射时为-1)offset
:文件映射的起始偏移量
返回值:
- 成功:返回映射区域的起始地址
- 失败:返回
MAP_FAILED
(即(void *)-1
)
典型用途:
- 文件映射:将文件直接映射到内存,提高I/O性能
- 大内存分配:分配超过128KB的内存块(避免堆碎片)
- 进程间通信:通过共享内存实现高效IPC
- 匿名映射:分配初始化内存(相当于malloc但更灵活)
2. munmap函数详解
munmap
用于解除内存映射关系,释放由mmap
创建的内存区域。
函数原型:
#include <sys/mman.h>
int munmap(void *addr, size_t length);
参数说明:
addr
:映射区域的起始地址(必须是页对齐的)length
:要解除映射的区域长度
返回值:
- 成功:返回0
- 失败:返回-1
注意事项:
- 解除映射后,对该区域的访问会导致段错误
- 映射区域会自动被内核回收,不需要像free那样担心内存泄漏
- 对文件映射,内核会在适当时候将脏页写回磁盘
3. mmap与munmap示例代码
#include <stdio.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <string.h>
int