C++动态内存管理

来源:互联网 发布:java web框架排行 编辑:程序博客网 时间:2024/06/08 02:25

1.C语言中malloc,calloc,realloc的不同

malloc/calloc/realloc用来在堆上开辟空间。

(1)malloc

void *malloc(size_t size);

malloc()在内存的动态存储区中分配一块长度为size字节的连续区域

(2)calloc

void *calloc(size_tnmemb,size_t size);

calloc()与malloc()相似,参数size为申请地址的单位元素长度,nemb为参数个数

(3)realloc

void *realloc(void *ptr,size_t size);

realloc是给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,size是重新申请的地址空间的大小

它们三者的区别:

malloc不能初始化所分配的内存空间,需要用memset;

calloc会将所分配的空间中的每一位都初始化为0;

realloc 可以改变原有内存空间大小,原有内存的内容保持不变;若不能改变,将会开辟一段新的内存,但不会对新开辟的空间进行初始化

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

 C++通过new和delete动态管理内存

new/delete动态管理对象

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


malloc/free和new/delete之间的区别和联系

1)它们都是动态管理内存的入口。

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

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

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

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

 new做了两件事

1)调用operator new分配空间;

2)调用构造函数初始化对象。

 delete也做了两件事

1)调用析构函数清理对象;

2)调用operator delete释放空间。

new[ ]

1)调用operator new分配空间;

2)调用N次构造函数分别初始化每个对象。

delete[ ]

1)调用N次析构函数清理对象;

2)调用operator delete释放空间。


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

//模拟new[]/delete[]#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);#define DELETE_ARRAY(PTR,TYPE)           \do                                   \{                                    \int N = *((int*)PTR - 1);            \for (int i = 0; i < N; i++)              \{                                    \   PTR[i].~TYPE();                   \}                                     \PTR = (TYPE*)((char*)PTR - 4);       \operator delete(PTR);                \}while (false);class AA{private :size_t i;public:AA(size_t i = 10){cout << "AA()" << endl;}~AA(){cout << "~AA()" << endl;}};int main(){AA* P2;NEW_ARRAY(P2, AA,10);DELETE_ARRAY(P2, AA);system("pause");return 0;}
运行结果


原创粉丝点击