概述
new是从堆区申请空间(作用等价于c语言:malloc calloc realloc)
delete是释放堆区空间(作用等价于c语言:free)
new和delete 操作的是基本类型的空间 和 malloc calloc realloc free 没有任何区别。
new和delete 操作的是自定义类型的空间 只能使用 new和delete。
new和delete操作基本类型空间
//从堆区申请int类型的空间
int *p1 = new int;
*p1 = 100;
cout<<"*p1 ="<<*p1<<endl;//100
delete p1;
//从堆区申请int类型的空间 并初始化为100
int *p1 = new int(100);
cout<<"*p1 ="<<*p1<<endl;//100
delete p1;
new和delete操作基本类型一维数组空间
//需求:从堆区申请一个int数组 有5个元素
//int *arr = new int[5]{10,20,30,40,50};
int *arr = new int[5];
int i=0;
for(i=0;i<5;i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
//注意:释放空间
delete [] arr;//释放数组的所有元素空间
//delete arr 只能释放第0个元素的空间
new和delete操作基本类型二维数组空间
//int (*arr)[4] = new int[3][4];
int (*arr)[4] = new int[3][4]{{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int i=0;
for(i=0;i<3;i++)
{
int j=0;
for(j=0;j<4;j++)
{
cout<<arr[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
delete [] arr;
必须使用new和delete操作类的对象空间
new 能申请空间 和 调用构造函数 malloc calloc 只能申请空间 不能调用构造函数。必须用new
delete 能调用析构函数 和 释放空间 free只能释放空间。必须用delete.
使用new和delete操作对象数组空间
1.普通对象数组
class A
{
public:
int m_A;
public:
A()
{
m_A=0;
cout<<"A无参构造 m_A="<<m_A<<endl;
}
A(int a)
{
m_A = a;
cout<<"A有参构造 m_A="<<m_A<<endl;
}
~A()
{
cout<<"A析构函数 m_A="<<m_A<<endl;
}
};
void test(){
//普通对象数组:每个元素为对象
//创建对象数组的时候 每个元素都会调用构造函数
//对象数组结束的时候 每个元素都会调用析构函数
A arr[5];
}
2.普通对象数组初始化:每个元素必须显示调用构造函数初始化
class A
{
private:
int m_A;
int m_B;
public:
A()
{
m_A=0;
cout<<"A无参构造 m_A="<<m_A<<endl;
}
A(int a, int b)
{
m_A = a;
m_B = b;
cout<<"A有参构造 m_A="<<m_A<<", m_B="<<m_B<<endl;
}
~A()
{
cout<<"A析构函数 m_A="<<m_A<<", m_B="<<m_B<<endl;
}
void showA()
{
cout<<"m_A="<<m_A<<", m_B="<<m_B<<endl;
}
};
void test()
{
//普通对象数组:每个元素为对象 尽量显示调用有参构造进行元素的初始化
//创建对象数组的时候 每个元素都会调用构造函数
//对象数组结束的时候 每个元素都会调用析构函数
A arr[5]={A(10,20),A(11,22),A(12,23),A(13,24),A(14,25)};
int i=0;
for(i=0;i<5;i++)
{
arr[i].showA();
}
}
堆区对象数组
class A
{
private:
int m_A;
int m_B;
public:
A()
{
m_A=0;
cout<<"A无参构造 m_A="<<m_A<<endl;
}
A(int a, int b)
{
m_A = a;
m_B = b;
cout<<"A有参构造 m_A="<<m_A<<", m_B="<<m_B<<endl;
}
~A()
{
cout<<"A析构函数 m_A="<<m_A<<", m_B="<<m_B<<endl;
}
void showA()
{
cout<<"m_A="<<m_A<<", m_B="<<m_B<<endl;
}
};
void test()
{
A *arr = new A[5]{A(10,20),A(11,22),A(12,23),A(13,24),A(14,25)};
int i=0;
for(i=0;i<5;i++)
{
//arr[i].showA();
//(*(arr+i)).showA();
(arr+i)->showA();
}
delete [] arr;
}
new delete和malloc free的区别
1、new不需要对申请的空间地址类型转换 malloc需要
2、new数组空间的时候 delete释放数组空间需要加[] free不需要
3、new 申请对象空间会调用构造函数 而malloc不会
4、delete释放对象空间会调用析构函数 而free不会(建议C++中使用new和delete)
网友评论