c/c++动态内存管理

来源:互联网 发布:手机淘宝退款退货流程 编辑:程序博客网 时间:2024/04/28 06:35

1.malloc 和 new的区别

转http://blog.csdn.net/zjc156m/article/details/16819357

2.new/delete的使用方法


注意new\delete的配对使用,否则可能会出现内存泄漏或者程序崩溃的问题


3.剖析new/delete & new[]/delete[]

(1)new/delete

new调用了operator new(),delete调用了operator delete(),

operator new和operator delete和malloc/free的用法相同,他们只负责分配/释放空间

不会调用构造函数和析构函数来初始化/清理对象

相当于operator new()/operator delete()只是malloc/free的一层封装

在调试过程中可以看到new/delete调用函数的过程,如图


(2)new[]/delete[]

new[count]是先动态开辟出一块count个对象空间,并在其最前面额外开辟出一块int型空间存放count。

delete[],先找到存放count的空间,再从存放count空间的后面析构count次(清理对象),再调用

operator delete[]()释放空间

如图


我们可以用宏模拟实现一下new[count]/delete[]操作符申请空间/释放空间

模拟实现new[count]

#define NEW_ARR(PTR,TYPE,N)\//利用续行符 \ 提高代码可读性do\{\PTR = (TYPE*)operator new(sizeof(TYPE)*N+4);\//额外开辟4个字节存放对象个数N*(int*)PTR = N;\PTR = (TYPE*)((int*)PTR +1);\for(int i=0; i<N; i++)\new(PTR+i)TYPE;\//定位new表达式是在已经分配的空间中调用析构函数初始化一个对象}while(false);

模拟实现delete[]

#define DELETE_ARR(PTR,TYPE) \do\{\int n = *((int*)PTR-1);\//找出ptr前4个字节中存放的NPTR = (TYPE*)PTR;\for(int i=0; i<n; i++)\//再调用N次析构函数PTR[i].~TYPE();\PTR = (TYPE*)((int*)PTR-1);\//释放开辟的总空间operator delete(PTR);\}while(false);