C 语言 malloc/free

内容简介

mallocfree 用于在 C 语言中手动管理堆内存。它们适合处理运行时才知道大小的数据,但也容易带来内存泄漏、越界访问和悬挂指针。

用法

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    int *p = malloc(sizeof(int));
    if (p == NULL) {
        return 1;
    }
 
    *p = 10;
    printf("%d\n", *p);
 
    free(p);
    p = NULL;
    return 0;
}

申请数组:

int count = 10;
int *arr = malloc(sizeof(int) * count);
if (arr == NULL) {
    return 1;
}
 
for (int i = 0; i < count; i++) {
    arr[i] = i;
}
 
free(arr);
arr = NULL;

最佳代码实践

  • 使用 sizeof(*p)sizeof(int) * count 明确申请字节数。
  • malloc 后立刻检查是否为 NULL
  • mallocfree 必须配对,谁申请谁释放。
  • 释放后把指针置为 NULL,减少重复释放和悬挂指针风险。
  • C++ 中优先用 new/delete、容器或智能指针,不要混用 C 和 C++ 的内存管理方式。

错误用法

int *p = malloc(10);  // 错误倾向:10 是字节数,不是 10 个 int
int *p = malloc(sizeof(int));
*p = 10;             // 错误:没有检查 malloc 是否失败
int *p = malloc(sizeof(int));
free(p);
free(p);             // 错误:重复释放
int *p = malloc(sizeof(int));
delete p;            // 错误:malloc 申请的内存不能用 delete 释放

注意事项

  • malloc 只分配内存,不会初始化内容;需要清零可用 callocmemset
  • realloc 可能移动内存位置,使用时要用临时指针接收返回值。
  • C 语言标准头文件是 <stdlib.h>,不是 <malloc.h>

相关:CandCpp指针CandCpp底层知识cppNewAndDelete操作符