C语言内存管理全解析
1. C语言内存管理基础
在C语言中,程序员需要全面负责内存管理,必须时刻关注所有内存分配情况。常见的编程陷阱之一是“释放后使用”(use-after-free),即当一块内存被释放后又被访问。一旦对某块内存调用了free()函数,程序就绝不能再访问其内容。程序员尤其要留意悬空指针,即那些非NULL但指向无效内存块的指针。有两个常用工具可辅助检测此类问题,分别是Electric Fence和valgrind。
1.1 数据对齐
数据对齐指的是数据地址与硬件测量的内存块之间的关系。若变量位于其大小整数倍的内存地址处,则称该变量是自然对齐的。例如,一个32位变量若位于地址是4的整数倍(即地址的最低两位为0)的内存位置,那么它就是自然对齐的。因此,大小为2^n字节的类型,其地址的n个最低有效位必须为0。
对齐规则源于硬件。某些机器架构对数据对齐有严格要求,在一些系统中,加载未对齐的数据会导致处理器陷阱;而在另一些系统中,访问未对齐的数据虽安全,但会降低性能。编写可移植代码时,必须避免对齐问题,确保所有类型都是自然对齐的。
1.2 分配对齐内存
多数情况下,编译器和C库会自动处理对齐问题。POSIX规定,通过malloc()、calloc()和realloc()返回的内存要能与任何标准C类型正确对齐。在Linux系统中,32位系统上这些函数返回的内存按8字节边界对齐