一、new和delete基本语法
> new运算符动态分配堆内存
使用形式: 1.指针变量 = new 类型(常量);
2.指针变量 = new 类型(表达式);
作用:从堆上分配一块“类型”大小的存储空间,返回首地址。
其中:“常量”是初始化值,可缺省。
创建数组对象时,不能为对象指定初始值。
> delete运算符释放已分配的内存空间
使用形式: 1.detele 指针变量;
2.detele[ ]指针变量;
其中:“指针变量”必须是一个 new 返回的指针。
//在堆上申请一个int类型大小的空间(4Bytes),并且将申请的堆空间的内容初始化为10
int *p = new int(10);
delete p;
//在堆上申请4个int类型大小的空间(4*sizeof(int)==16Bytes) 4:数组长度
int *p2 = new int[4];
delete[] p2;
class Animal
{
public:
int age;
int len;
/* 默认构造函数 */
Animal()
{
cout<<"Animal()"<<endl;
}
Animal(int x,int y):age(x),len(y)
{
cout<< "Animal(int x,int y):age(x),len(y)"<<endl;
}
};
int main()
{
//在堆上申请一个Animal类型大小的空间
Animal *p3 = new Animal; //调用无参构造函数
delete p3;
//在堆上申请二个Animal类型大小的空间
Animal *p4 = new Animal[2];//调用无参构造函数
delete[] p4;
//在堆上申请一个Animal类型大小的空间
Animal *p5 = new Animal(10,10);//调用带参数的构造函数
delete p5;
return 0;
}
二、new 和 delete 和 malloc free的区别
注意:new 和 delete是运算符,不是函数,因此执行效率高。
虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用malloc和free函数,而用new和delete运算符。
区别:
1.malloc和free为C标准库函数,new、delete则为C++的操作运算符
2.new能自动计算需要分配的内存空间,而malloc需要手工计算字节数
3.new与delete直接带具体类型的指针,而malloc和free返回void类型的指针
4.new类型是安全的,而malloc不是,例如int* p=new float[2]就会报错,而int p等于malloc(2*sizeof(int))编译时编译器就无法指出错误来
5.new 调用构造函数,malloc不能;delete调用析构函数,而free不能
6.new/delete 是操作符可以重载,malloc/free则不能