C/C++动态内存管理

来源:互联网 发布:在线php编辑器 编辑:程序博客网 时间:2024/06/05 18:07

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 );

关于malloc函数的用法

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);
原创粉丝点击