C++内存动态管理

来源:互联网 发布:阿里云服务器https解析 编辑:程序博客网 时间:2024/06/15 00:57

一:malloc/free和new/delete之间关系和差异。

malloc/free 是C语言中的 动态开辟内存的一套使用方法,而new/delete是C++面向对象语言中独有的动态开辟内存的一套使用方法。

C语言是C++的子集,C++兼容一切C语言,所以理论上来说 ,也是 能用malloc和delete匹配的,或者 new和 free匹配的。

1:他们都是动态管理内存的入口。都可以用来动态开辟空间

2:malloc/free是 C/C++标准库的函数,new/delete是C++的操作符

3:malloc/free只是动态分配内存空间/释放空间。而new/delete除了分配空间还会调用构造和析构函数进行初始化和清理工作(清理成员)。

4:malloc/free需要手动计算类型大小并且返回值为void*, new/delete可自己计算类型的大小,并且返回对应的指针。

二:剖析new/delete、new[]/delete[]到底做了些什么事情。

在使用new时,编译器先调用operator new分配空间,其次构造函数初始化对象。

在使用delete时,编译器先调用析构函数,再operator delete释放空间。

在使用new[]时,编译器先调用operator new分配空间,其次再调用N次构造函数。

在使用delete[]时,编译器先调用析构函数,再用operator delete释放空间。

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

#include <iostream>
using namespace std;


#define NEW(ptr, type, n) \
do { \
ptr = (type*) operator new(sizeof(type)*n);   \
new(ptr)type;
}while(0);
#define DELETE(ptr, type)  \
do{ \
ptr->~type; \
operator delete(ptr);\
} while(0);


#define NEW_ARRAR(ptr, n ,type) \
do { \
ptr = (type*)operator new(sizeof(type)*n+sizeof(int)); \
*(int*)ptr = n ;\
ptr = (type*)((int *)ptr+4);        \
for (size_t i = 0; i<n; i++)\
{ new(ptr)type;\
}while(0);





#define DELETE_ARRAY(ptr, type) \
do{ \
size_t n = *(int *)(ptr-1); \
for (size_t i = 0; i<n; i++) \
{ \
(ptr+i) ->~AA();\
} \
operator delete((char*)ptr -4)\
} while(0);


//模拟NEW[]/DELETE[]申请和释放数组。