1.数组与malloc的区别
malloc、calloc与realloc都是C/C++的标准库函数之一,用来动态在堆上分配内存。
一般来说由C/C++编译的程序在运行的时候都会在内存中占用一些空间,他们分为以下5个部分。
1)二进制代码区 就是放二进制代码的地方
2)栈 一些局部变量、临时变量和函数形参,由编译器分配内存
3)堆 动态内存区,程序员可以控制分配和释放的区域
4)常量区 存放文字字符串和常量
5)静态存储区 存放静态和全局变量
由以上可知数组与malloc的第一个区别,malloc从堆中分配内存,而普通数组则是在栈中。
堆是系统内存中的可用区域,和数据结构中的堆(Heap)意义并不相同,基本可以看成是空闲内存组成的大链表。通常来说,int a[100]在栈中占据的内存一般是连续的,而int *p = (int *)calloc(100, sizeof(int))在堆中所占据的内存却未必连续,内存之间可能是断开的,操作系统利用链表的形式来管理这些内存块。
其实定义int a[100],a会隐式转化为int * const p,所以无论是malloc分配的内存还是数组分配的内存,访问数据的形式都是一样的,既可以利用下标(a[1]),也可以利用指针(*(a+2))。
第二个区别是,使用过malloc之后,程序员需要通过free函数释放掉内存。
2.new、delete与malloc、free之间的区别
1)使用上的区别
int *p = (int *)malloc(100*sizeof(int));
free(p);
int *p = new int[100]();
delete [] p;
2)所能完成的功能不一样
malloc与free都是C/C++标准库函数,而new和delete都是C++操作符,malloc与free的使用需要头文件声明(#include <stdlib.h>),new、delete则不需要,new与malloc实现的功能相同,但是new更精炼。new在分配内存(创建对象)的同时,会调用构造函数,delete在释放内存(对象消亡)前,则会调用析构函数,malloc和free是库函数而非运算符,不在编译器的控制权限之内,因此不能把执行构造函数和析构函数的任务强加于malloc和free之上。