C/C++动态内存管理
- C: malloc、calloc、realloc、free
- C++:new\delete、new[]\delete[]
- malloc/free与new/delete
- 实现NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组。
- operate new/operate delete
malloc、calloc、realloc、free
- void* malloc(size_t size) 在内存堆空间中申请一块固定大小的空间,返回起始位置指针,没申请到返回NULL。
- void* calloc (size_t num, size_t size)在内存中申请 个数*类型大小 的数组空间,返回\~\~同上\~\~
- void* realloc(void* memblock, size_t size) 将所传指针指向的空间调整为指定大小,返回新空间起始位置。
- free 释放所指空间。
- malloc、calloc、realloc要分别与free组合使用,避免内存泄漏;要将返回的指针进行强制类型转换。
new\delete、new[]\delete[]
- new TYPE 在内存中申请一块 TYPE 类型大小的空间,返回相应类型的指针。并调用构造函数初始化,可以跟 () 传参初始化。
- delete P 自动识别 *P 类型,调用析构函数并释放该空间,与new匹配使用。
- new TYPE[N] 在内存中申请 N 块 TYPE 类型大小的空间,返回 TYPE 型的指针。并调用N次构造函数初始化,悄悄告诉大家:可以跟 {} 传参初始化。
- delete[] P 自动识别 *P 类型,由编译器识别并调用 N 次析构函数并释放该空间,与 new[] 匹配使用。

malloc/free与new/delete
- 都是动态内存管理入口
- malloc/free是C/C++库函数,new/delete是C++操作符
- malloc/free只负责申请/释放空间,new/delete还要调用构造/析构函数
- malloc 使用时要自己计算空间大小,返回 void* 指针,使用指针要自己强转;new 会自己计算空间大小,返回相应类型指针
实现NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组。
#define NEW_ARRAY(P, TYPE, N) \
do{ \
int* P_NEW = (int*)malloc(sizeof(TYPE)*N + 4); \
((int*)P_NEW)[0] = N; \
P = (TYPE*)(P_NEW + 1); \
int I_NEW = 0; \
for (; I_NEW < N; I_NEW++) \
new(P + I_NEW)TYPE; \
} while (false);
#define DELETE_ARRAY(P, TYPE) \
do{\
int n = *((int*)P - 1); \
while (n--)\
(P[n]).~TYPE(); \
free((int*)P - 1); \
} while (false);
- do{}while(false) 是为了生成一个局部域,定义和使用临时变量,避免变量重定义。
- 在前面多申请四字节空间保存一个 int 型变量,记录数组元素个数。
operate new/operate delete
- operate new/operate delete的作用和 malloc/free 的作用完全相同,只是申请或释放空间。
- new/delete 是通过 operate new/operate delete 来申请/释放空间的。
- operate new/operate delete 事实上只是 malloc/free 的一层封装。