malloc和free详见《C和指针》P221;
new详见《C++primer》P423;
另:参考各位大神的整理
简答题:malloc/free与 new/delete的区别是什么?(10分)
1、运算符new可以自动计算所要分配的空间的大小。
2、new能够自动返回正确的指针类型,不需要用户对返回指针进行强制类型转换。
3、new是运算符,效率更高。
4、new分配的空间只能用显示的用delete释放。否则会发生内存泄漏。
5、new如果分配不成功的话,会返回一个空指针。
计算机的内存被分为4个区域:
程序代码区
全程数据区
堆(堆上的内存可以被用户自由分配和释放)
栈
C中提供了malloc(calloc和realloc)和free函数来进行动态内存管理。
C++中提供了new和delete运算符来进行动态内存管理。
new和delete是运算符,所以性能要更高效(没有函数调用时的开销),使用更灵活。
用new分配内存的基本形式:
指针变量名=new 类型;(
运算符new从堆上分配一块与类型字节数相等的内存空间,并将这块空间的首地址存到指针变量中。)
eg:
char *p;
p=new char;
//new动态分配存放一个字符的空间,并将这块空间的首地址赋给p
运算符delete用于释放运算符new分配的的存储空间。其基本形式为:
delete 指针变量名;
delete p;
//将new分配的空间进行释放
用new为数组动态内存分配,这时需要在类型名后面加上数组的大小。其形式如下:
指针变量名=new 类型名[数组大小];
例:
int *p=new int[5];
//new分配了一个有5个元素的整型数组
释放动态分配的数组存储区时,可以使用delete运算符。其形式如下:
delete []指针变量名;
//指针变量名前加一对[],无需指定大小,表示释放的是数组
例:delete []p;
//释放了new开辟的具有5个元素的整型数组
用new在为简单变量进行分配空间的同时,可以进行初始化。其形式如下:
指针变量名=new 类型名(初始值);
例:int *p;
p=new int(20);
//分配一个整型,并将20作为这块空间的初始值
注意:运算符new不能对动态分配的数组存储区进行初始化。