malloc calloc realloc

定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Linux
#include <stdlib.h>
void *malloc(size_t size);
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
void free(void *ptr);

// FreeBSD
#include <stdlib.h>
#include <malloc_np.h>
void *malloc(size_t size);
void *calloc(size_t number, size_t size);
void *realloc(void *ptr, size_t size);
void free(void *ptr);

区别

函数之间的区别

  1. malloc申请的区域值不被初始化,而calloc会将其初始化为0
  2. malloc输入为需要的字节数,calloc输入为对象数nmemb与每个对象字节数size
  3. realloc为已分配的地址重新分配大小,可增可减

三个函数均通过系统调用sbrk实现。

mallocnew运算符的区别

  1. mallocstdlib.h中的库函数,而new是C++运算符
  2. malloc需要指定所需字节数,new则由编译器推算,无需指定大小
  3. malloc返回void *,后续需要自己转换类型,new则直接返回申请对象类型的指针
  4. malloc申请失败时返回NULLnew则会抛出异常std::bad_alloc
  5. malloc直接在堆上分配内存,new则在自由存储区上分配。大部分编译器用堆实现自由存储区。堆是操作系统维护的内存区域,而自由存储区是C++概念