一、malloc/free
1、C语言:malloc free
2、原型:void* malloc(size_t size); void free(void *ptr);
3、malloc是函数,开辟的大小需要手动传入
二、new/delete
1、C++:new delete
2、new和delete是关键字,开辟的大小不需要手动传入
三、区别:
1、new是关键字; malloc是函数
2、开辟内存大小,new开辟为自由存储区;malloc在堆上开辟
char* pc = new(&a)char(‘a’); //pc指向a的第一个字节,在栈上开辟
3、new还可以做初始化;malloc只能开辟内存
4、new可以重载;malloc不能重载
5、new可以调用malloc;malloc不能调用new
语法:new里面第一步是operator new ;malloc是系统提供的版本
兼容版本:向前兼容,C先出现的
6、内存开辟,new抛异常;malloc返回NULL
new不需要判断,malloc需要用if判断是否为空
int * p = new[10] ; //operator new [](size_t size);
7、new可以开辟常量;malloc不能
malloc的原型:void* malloc(size_t size);没有接收常属性的地方
new可以
8、new能够自动计算需要分配的内存空间;而malloc需要手工计算
eg:int* p1 = new int[2];
int* p2 = malloc(2*sizeof(int));
9、new与delete直接带具体类型的指针,malloc与free返回void类型的指针。
10、new是类型安全的;malloc不是
eg:int p1 = new float[2]; //编译时会报错
int* p2 = malloc(2*sizeof(float)); //编译时编译器无法指出错误来
11、new一般由两步构成,分别是new操作和构造。new操作对应于malloc,但new操作可以重载,可以自定义内存分配策略,不做内存分配,甚至分配到非内存设备上,而malloc不行
12、malloc/free需要库文件stdlib.h支持,new/delete则不需要库文件支持
四、注意事项
1、有资源的申请,就有资源的释放,否则就会出现资源泄漏(也称内存泄漏的问题),所以new/delete,malloc/free必须配对使用
2、delete和free被调用后,内存不会立即收回,指针也不会指向空,delete与free仅仅是告诉操作系统,这一块内存被释放了,可以用作其他用途。但是,由于没有重新对这块内存进行写操作,所以内存中的变量数值并没有发生变化,出现野指针的情况。因此,释放完内存,应该将指针指向置为空
3、malloc/free的保留
由于C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存,所以仍然保留了malloc/free