在c语言中使用函数malloc和free来进行内存管理(分配与释放),在c++中则提供了运算符new和delete来做同样的工作,后者比前者性能更优越,使用更方便更灵活。
1.new用于内存分配的基本形式为:
指针变量名=new 类型
在程序运行过程中new是从堆的一块自由存储区中为程序分配一块与类型字节数相适应的内存空间,并将该块内存的首地址存于指针变量中。
eg.
int *p; //声明一个整形指针变量p
p=new int; //动态分配一个存放int型数据的内存空间,并将首地址赋给p
delete 指针变量名
delete p;
运算符new和delete功能类似于函数malloc()和free();但是他们有以下几个优点:
(1)运算符new可以自动计算所要分配内存类型的大小,而不必使用函数sizeof()来计算所需要的字节数,这就减少了发生错误的可能性。
(2)运算符new能够自动返回正确的指针类型,不必对返回指针进行强制类型转换。
在此要注意:
(1)用运算符new分配的空间,使用结束后应该只能用运算符delete显示地释放,否则这部分空间将不能回收而变成死空间,如果这样一直new下去,系统可能会造成瘫痪。
(2)用运算符new动态分配内存时,如果没有足够的内存满足分配要求,new将返回空指针(NULL),故通常要对内存的动态分配是否成功进行检查。
(3)若用free释放new创建的动态对象,那么该对象因无法执行析构而导致程序出错。用delete释放malloc申请的动态内存,理论上是不会出错的,但该程序的可读性很差。
eg.
int main()
{
int *p;
p=new int;
if(!p)
{
cout<<"allocation failure";
return 1;
}
*p=10;
cout<<*p;
delete p;
return 0;
}
如果使用运算符new为数组动态分配内存时,这时要在类型名后面加上数组大小。
例如:
int *p=new int[10];
如果是为多维数组分配空间时:
例如:
int *pi=new int[2][3][4];
用delete删除时,无需指出所删除的维数和大小。只需在指针前面加一个方括号,表示对数组空间的操作。
eg. delete []pi;
new delete和malloc free的区别:
1.new delete 是c++中的操作符,而malloc free为c中的一个函数。
2.new 不止分配内存而且会调用类的构造函数,delete会调用析构函数,malloc只分配内存不会进行初始化类成员工作,free不会调用析构函数。
3.new出来的指针是直接带类型信息的,而malloc返回的都是void指针。