1:总结并剖析malloc/free和new/delete之间关系和差异。
2:剖析new/delete、new[]/delete[]到底做了些什么事情。
3:实现NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组。
C动态内存管理
C语言使用malloc/realloc/calloc/free进行动态内存管理
realloc=>指针给空时,与malloc作用一样void *realloc( void *memblock, size_t size );
calloc开空间,初始化void *calloc( size_t num, size_t size );
malloc负责开空间void *malloc( size_t size );
C++动态内存管理
C++通过new和delete动态管理内存
new/delete动态管理对象
new[]/delete[]动态管理数组
注意:malloc/free,new/delete,new[]/delete[]一定要匹配使用,否则可能出现内存泄漏甚至崩溃的问题
1:总结并剖析malloc/free和new/delete之间关系和差异。
相同点:都是动态内存管理的入口
不同点:1)malloc和free是C/C++中的标准库函数,new和delete是C++的运算符。
2 ) malloc失败后返回值为0,而new失败后会抛异常。
3)new返回指定类型的指针并且可以自动计算所需大小;而 malloc 则必须要由我们计算字节数,并且在返回后强行转换为实际类型的指针。
//new/delete
int *p;
p = new int; //返回类型为int *类型,分配的大小为sizeof(int)
p = new int[100]; //返回类型为int *类型,分配的大小为sizeof(int) * 100
//malloc/free
int* p;
p = (int *)malloc(sizeof(int)* 128);//分配128个(可根据实际需要替换该数值)整型存储单元,并将这128个连续的整型存储单元的首地址存储到指针变量p中
double *pd = (double *)malloc(sizeof(double)* 12);//分配12个double型存储单元,并将首地址存储到指针变量pd中
2:剖析new/delete、new[]/delete[]到底做了些什么事情。
new/delete
new —>调用operator new()分配空间
—>调用构造函数初始化对象
delete—>调用析构函数进行清理工作
—>调用operator delete()释放空间
new[]/delete[]
new[N] —>调用operator newN分配空间
—>调用N次构造函数分别初始化对象
delete[N]—>调用N次析构函数进行清理工作
—>operator deleteN释放空间
3:实现NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组。
模拟实现NEW
#define NEWARRAY(PTR,TYPE, N) \
do \
{ \
PTR = (TYPE*)operator new(sizeof(TYPE)*n) \
for (size_t i = 0; i < n; ++i) \
new(PTR + i)TYPE; \
}while (false);
模拟实现DELETE
#define DELETEARRAY(PTR,TYPE) \
do \
{ \
size_t N = *((int*)PTR - 1); \
for (size_t i = 0; i < ; ++i) \
PTR[i].~TYPE(); \
PTR = (TYPE*(char*)PTR - 4; \
operator delete(PTR); \
} while (false);