动态内存管理

来源:互联网 发布:最陡下降算法 编辑:程序博客网 时间:2024/06/06 00:54
1:malloc/free和new/delete之间关系和差异。
共同点:他们都是动态管理内存的入口
不同点:
(1)malloc/free是C/C++的标准库函数,而new/delete是C++操作符;
(2)malloc/free使用时要自己对于类型大小进行计算,返回值为void*;
         new/delete使用时不需要自己计算类型大小,返回值为对应类型的指针;
(3)malloc/free只是动态分配内存空间,new/delete除了分配空间,还会调用构造函数和析构函数进行初始化和清理;
(4)malloc/free如果失败了返回0,new/delete如果失败了会抛异常。

2:new/delete、new[]/delete[]到底做了些什么事情
new: 先调用 operator new分配空间,然后调用构造函数初始化对象。
delete: 先调用析构函数清理对象,然后调用operator delete释放空间。

new[N]:先调用 operator new分配空间,然后调用N次构造函数初始化对象。
delete[]:先调用N次析构函数清理对象,然后调用operator delete释放空间。

3:NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组。

#define_CRT_SECURE_NO_WARNINGS

#defineNEW_ARRAY(PTR,TYPE,N)                   \
do{                                                 \
PTR = (TYPR*)operatornew(sizeof(TYPE)*N + 4);  \
(*(int*)PTR) = N;                               \
PTR = (TYPE*)((char*(PTR)+4));                  \
for(size_t i = 0; i < N; i++)                   \
new(PTR + i)TYPE;                               \
}while(false);
#defineDELETE_ARRAY(PTR,TYPE)         \
do{                                         \
size_t N = *((int*)PTR - 1);            \
for(size_t i = 0; i < N; i++)          \
PTR[i].~TYPE();                             \
PTR = (TYPE*)((char*)PTR - 4);          \
operatordelete(PTR);                  \
}while(false);
原创粉丝点击