1.基本语法
C语言中是利用库函数malloc和free来分配和撤销内存空间的。C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数。
new和delete是运算符,不是函数,因此执行效率高。
- new运算符动态分配堆内存
指针变量=new 类型(常量);
指针变量=new类型[表达式];
作用:从堆分配一快“类型“大小的存储空间,返回首地址,”常量“是初始化直(可缺省);创建数组对象时不能为对象指定初始值。
- delete运算符释放已分配的内存空间
delete 指针变量;
delete[] 指针变量;
其中指针变量必须是一个new返回的指针。
new int; //开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针)
new int(100); //开辟一个存放整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址
new char[10]; //开辟一个存放字符数组(包括10个元素)的空间,返回首元素的地址
new int[5][4]; //开辟一个存放二维整型数组(大小为5*4)的空间,返回首元素的地址
float *p=new float (3.14159); //开辟一个存放单精度数的空间,并指定该实数的初值为//3.14159,将返回的该空间的地址赋给指针变量p
2.类对象的动态创建
有时希望在需要用到对象时才建立对象,在不需要用该对象时就撤销它,释放它所占的内存空间以供别的数据使用。这样可提高内存空间的利用率。可以用new运算符动态建立对象,用delete运算符撤销对象
Box *pt; //定义一个指向Box类对象的指针变量pt
pt=new Box; //在pt中存放了新建对象的起始地址在程序中就可以通过pt访问这个新建的对象。如
cout<<pt->height; //输出该对象的height成员
cout<<pt->volume( ); //调用该对象的volume函数,计算并输出体积
Box *pt=new Box(12,15,18);//C++还允许在执行new时,对新建立的对象进行初始化
在执行new运算时,如果内存量不足,无法开辟所需的内存空间,目前大多数C++编译系统都使new返回一个0指针值。只要检测返回值是否为0,就可判断分配内存是否成功。
3.一些深入理解
- 对于基础类型,new delete和malloc free可以混搭使用。
void main()
{
int *p = (int*)malloc(sizeof(int) * 10);
p[0] = 1;
delete[] p;
int *pArray = new int[10];
pArray[1] = 2;
free(pArray);
system("pause");
return;
}
- malloc对类进行操作时,只会分配内存大小但不会调用类的构造函数;但new会调用构造函数进行初始化
- free只会清除内存,不会调用析构函数。