C++动态内存管理

来源:互联网 发布:淘宝十大男模 编辑:程序博客网 时间:2024/05/22 01:32

1.malloc/free和new/delete之间关系和差异。

相同点:都是用来管理动态内存的,必须成对出现,因为一个用于申请动态内存,一个用于释放内存。
不同点:

  1. malloc/free是C++/C语言的标准库函数,new/delete是c++的运算符,对于非内部数据类型的对象而言,只有malloc、free是无法满足动态对象的要求的。因为对象在创建的时候会自动调用构造函数,对象消亡时会自动调用析构函数。因为malloc/free是库函数而不是运算符,不在编译器控制的范围内,不能够执行构造函和析构函数 。这种差别就是由于面向过程和面向对象的差异引起的。
  2. 函数的使用方法不同,可以看一下malloc/free的函数原型
    void *malloc(size_t,size);void free(void pointer);
    有函数原型可以看出使用malloc的返回类型是void,而且没有初始化,但对比new的使用可以明显看出new在使用时的做的工作比较多它不仅根究类型开辟出了空间,而且进行了初始化。所以相比于malloc,new更加安全方便。并且new还支持重载,显然malloc并不支持。
    malloc比起new好处就在于malloc还有个与之对应的函数reallc,reallc的作用是在已开辟的空间后再开辟一些空间,而当reallc第一个参数为NULL时它的作用与malloc相同。calloc与malloc区别在于calloc在返回指向内存的指针之前把它初始化为0。

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

new/delete
new[]/delete[]

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

//用宏实现NEW_ARRAY和DELETE_ARRAY//开辟空间//将第一个位置用来存放个数//将p指针指向剩下的空间//进行初始化#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);                         \for (int I_NEW = 0; 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);
原创粉丝点击