C++内存管理
一、malloc/free和new/delete之间关系和差异
(1)操作对象有所不同:
malloc和free是C++/C语言的标准库函数,new/delete是C++运算符。 malloc/free无法满足动态开辟对象的空间的要求,因为对象在创建的同时要执行构造函数,对象消亡的时候会自动调用析构函数。
(2) 用法上也有所不同
malloc原型:void*malloc(size_t size)
用malloc申请一块长度为length的整数类型的内存:
int*p=(int*)malloc(sizeof(int)* length);
函数free的原型如下:
void free( void* memblock)
由于指针p的类型以及它所指的内存的容量都是知道的,所以free(p)能正确的释放内存,如果p是NULL指针,那么free多少次都不会出问题,如果不是NULL,free两次就会出导致程序运行错误。
new/delete的使用特点:
int*p1 = (int* )malloc(sizeof(int)* length);
int*p2 = new int[length];
new内置了sizeof、类型转换、类型安全检查功能。对于非内部数据类型的对象而言,new在创建动态队形的同事也完成了初始化工作。
区别与联系总结:
1.都是动态管理内存的入口;
2.malloc/fre是C/C++标准库函数,new/delete是C++操作符;
3.malloc/free只是动态分配/释放内存空间,而new/delete除了分配空间还会调用构造函数和析构函数初始化和清理;
4.malloc/free需要手动计算类型大小且返回值为void*,new/delete可计算类的大小并返回对应类型的指针。
二、剖析new/delete、new[]/delete[]到底做了些什么事情
标准库函数operator new和operator delete的命名容易让人误解,这些函数并没有重载new或delete表达式,我们不能定义new或delete的行为。
void*operator new(size_tsize);
void operator delete(size_tsize);
void*operator new[](size_tsize);
voidoperator delete[](size_tsize);
总结:
1.operator new/operator delete operator new[]/operator delete[]和malloc/free用法一样。
2.他们只负责分配空间/释放空间,不会调用对象构造函数/析构函数来初始化/清理对象。
3.实际operatornew和operatordelete只是malloc和free的一层封装。
new做了两件事
1.调用operator new分配空间。
2.调用构造函数初始化对象。
delete也做了两件事
1.调用析构函数清理对象
2.调用operator delete释放空间
new[N]
1.调用operator new分配空间。
2.调用N次构造函数分别初始化每个对象。
delete[]
1.调用N次析构函数清理对象。(思考这里怎么N是怎么来的?)
2.调用operator delete释放空间。
三、实现NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组。
“`
define NEW_ARRAY(PTR,TYPE,N)\
do{ \
PTR = (TYPE*)operator new(sizeof(TYPE)*N+4);/*开辟空间*/ \
(*(int*)TYPE) = N; \
PTR = (TYPE*)((char*)PTR+4); \
for(size_t i = 0; i < N; i++) \
new(PTR+i)TYPE; /*进行初始化*/ \
}while(false);
define DELETE_ARRARY(PTR,TYPE) \
do{ \
size_t N = ((int)PTR) - 1 \
for (size_t i = 0; i < N; ++i) \
PTR[i].~TYPE() \
PTR = (TYPE*)((char*)PTR - 4) \
operator delete(PTR) \
} while (false)
推荐阅读
-
Java中由substring方法引发的内存泄漏详解
-
30分钟学会C/C++指针 (二)
-
《死亡之旅》 第2版 项目管理敏捷开发LISPXPSmalltalk
-
asp.net微信开发(永久素材管理)
-
FIR.im 帮你生成管理邀请码 -- inCode 移动开发内测iOSAndroid
-
FIR.im 帮你生成管理邀请码 -- inCode 移动开发内测iOSAndroid
-
asp.net微信开发(用户分组管理)
-
Spring+SpringMVC配置事务管理无效原因及解决办法详解
-
《死亡之旅》 第2版 项目管理敏捷开发LISPXPSmalltalk
-
C++时间表 C#CC++OOSmalltalk