动态内存管理

来源:互联网 发布:贴吧群发软件 编辑:程序博客网 时间:2024/06/07 16:41

1:总结并剖析malloc/free和new/delete之间关系和差异。

C语言动态内存管理:

开辟空间: malloc   calloc   realloc

释放空间: free

C++动态内存管理:

开辟空间: new :开辟指定大小空间

                   new[ ] :开辟数组空间

释放空间:delete :释放空间

                  delete[ ]:释放数组空间

1:总结并剖析malloc/free和new/delete之间关系和差异。

(1)malloc/free 是C/C++标准库函数,new/delete是操作符。

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

(3)malloc/free需要手动计算类型大小,new/delete可以自己计算类型大小。

(4)malloc 失败了返回0,new失败了会抛异常。

new/delete动态管理对象,new[ ]/delete[ ]动态管理对象数组:

注意:malloc/free   new/delete   new[ ]/delete[ ]  一定要配套使用,否则可能会出现内存泄漏!!!

void Test(){int* p1 = new int; //动态的分配4个字节的空间int* p2 = new int(6);//动态的分配4个字节空间,并初始化为6int* p3 = new int[6];//动态的分配24个字节的空间delete p1;delete p2;delete[] p3;}
2:剖析new/delete、new[]/delete[]到底做了些什么事情。

(1)new/delete

new做了两件事:1)调用operator new 分配空间;2)调用构造函数初始化对象.

delete做了两件事:1)调用析构函数清理对象;2)调用operator delete 释放空间.

(2)new[ ]/delete[ ]

new[ ]做了两件事:1)调用operator new分配空间;2)调用N次构造函数分别对每个对象进行初始化.

delete[ ]做了两件事:1)调用N次析构函数分别对每个对象进行清理;2)调用operator delete 释放空间.

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

(1)模拟实现new[ ]

#define NEW_ARRAY(PTR,TYPE,N)                   \do{PTR = (TYPE*)operator new(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);                                  


(2)模拟实现delete[ ]

#define DELETE_ARRAY(PTR,TYPE)    \do{                               \for(size_t i = 0; i < N;i++)  \PTR[i].~TYPE();           \PTR = (TYPE*)((char*)PTR-4);  \operator delete(PTR);         \}while(false);

吐舌头!

原创粉丝点击