前言
malloc()
与 free()
是C语言中使用的内存分配和内存释放库函数。
new
与delete
是C++种使用的内存分配和内存释放运算符。
本文,从两组函数的机制讲述两组概念的区别于联系。
使用方法
malloc()
与free()
函数原型:
void *malloc(size_t size);
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
void free(void *ptr);
-
函数解释
malloc()
函数分配size
大小的未初始化的内存。并返回指向该内存首地址的指针。如分配异常,返回空指针
calloc()
函数分配nmemb
个长度为size
的连续空间。
realloc()
函数将ptr
指向的指针,重新分配大小为size
。free()
函数malloc()
等三个函数分配的内存,其输入参数即使malloc()
返回的指针。
如果malloc()
中,传入的参数size == 0
,则该函数返回NULL
或者unique pointer value
。 -
函数原理
malloc
一般从堆中申请空间(请参考操作系统相关的知识)。如果申请的内存大于MMAP_THRESHOLD
(默认为128kB,可以用mallopt(3)
设置),则**使用mmap(2)
匿名映射完成内存分配。 -
使用注意事项
- 分配了之后,检查是否分配成功
- 使用之后,必须释放
- 只能释放一次,破坏其他数据
new
与delete
同样是从堆中分配动态内存。
new会调用构造函数对对象进行初始化,且不需要指定分配内存的大小,如分配异常,抛出bad_malloc异常。
delete会调用析构函数
new
与delete
最终都会调用malloc
与free
。