1 使用
-
m a l l o c 、 f r e e malloc、free malloc、free 为 C C C 的标准库函数,需要引入库 stdlib.h 或者 malloc.h(malloc.h 与 alloc.h一致),函数原型为:
void* malloc(size_t size) //参数代表字节个数 void free(void* pointer) //参数代表内存地址
-
n e w new new、 d e l e t e delete delete 则为 C + + C++ C++ 的操作运算符,它调用的分别为赋值运算符重载 o p e r a t o r n e w ( ) operator\ new() operator new() 和 o p e r a t o r d e l e t e ( ) operator\ delete() operator delete()
2 内存分配位置
- m a l l o c : malloc: malloc:堆区
- n e w : new: new:自由存储区。
- 自由存储区和堆区
3 开辟空间大小
- m a l l o c malloc malloc 开辟空间类型大小需要手动计算,作为参数传递
- n e w new new 是由编译器自动计算类型大小
4 异常检测
- m a l l o c malloc malloc 开辟失败返回 N U L L NULL NULL ,导致空指针出现,需要对地址检查判空。
- n e w new new 不需要判断,当分配内存失败时,会抛处 b a c _ a l l o c bac\_alloc bac_alloc 异常。
5 额外工作
- m a l l o c / f r e e malloc/free malloc/free 函数只是开辟空间/释放空间。
- n e w / d e l e t e new/delete new/delete 不仅负责开辟空间/回收空间,并调用构造函数/析构函数,进行初始化/清理工作。
-
n e w / d e l e t e new/delete new/delete 实现机制:
-
n e w [ ] / d e l e t e [ ] new[]/delete[] new[]/delete[]实现机制:
如过程所示, n e w [ ] new[] new[] 会多开辟四个字节,用于存放对象的个数。返回地址时,会向后偏移四个从而指向数据首地址。d e l e t e [ ] delete[] delete[] 时,则会查看内存上对象的个数,从而根据个数count来确定调用几次析构函数,完成全部对象的清理内存工作。
6 扩充 / 缩小
- m a l l o c malloc malloc 分配内存后,如果不够或者太多,可以使用 r e a l l o c ( ) realloc() realloc() 函数对其进行扩充或缩小。
- n e w new new 分配好的内存不能直观简单的改变。
7 内存分配失败
- n e w new new 分配内存失败,用户可以指定处理函数,或重新制定分配器。【 n e w _ h a n d l e r new\_handler new_handler 可以在此处进行扩展】
- m a l l o c malloc malloc 分配失败,用户是不可以处理的。
8 释放判空检测
- free 空指针会造成错误,必须判空。
- 而delete遇到空指针,不会做任何事情,不需要额外判空。
- 建议:无论是free还是delete,在释放之后,都习惯性的将指针置空,避免出现野指针或者悬垂指针。