目录
(2)、如果想让对象数组中的元素调用有参构造 必须人为使用 有参构造初始化。
知识点6 【delete不能作用void *修饰的对象指针】
知识点7 【malloc、free和new、delete 不可以混搭使用】
new从堆区申请, delete释放堆区空间
知识点1 【new为基本类型 申请堆区空间】
void test01()
{
//1、 申请空间
int *p = NULL;
p = new int;//申请空间
*p = 100;
cout<<"*p = "<<*p<<endl;//100
delete p;//释放空间
//2、申请空间 并赋值
p = new int(10);//申请空间 并赋值为10
cout<<"*p = "<<*p<<endl;//10
delete p;//释放空间
}
知识点2 【new为基本类型数组 申请堆区空间】
注意:
new 没有加[] delete释放的时候 就不加[]
new 加[] delete释放的时候 就加[]
void test02()
{
int n = 5;
int *arr = NULL;
//申请基本类型数组类型
arr = new int[n]{10,20,30,40,50};
int i=0;
for(i=0;i<n;i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
//释放空间
delete [] arr;
}
知识点3 【new申请自定义数据类型】(结构体、类型对象)
class Data
{
public:
int m_a;
int m_b;
public:
Data()
{
m_a = 0;
cout<<"Data无参构造 m_a = "<<m_a<<endl;
}
Data(int a, int b)
{
m_a = a;
m_b = b;
cout<<"Data有参构造 m_a = "<<m_a<<endl;
}
~Data()
{
cout<<"析够函数m_a = "<<m_a<<endl;
}
};
void test03()
{
//1、申请Data对象
Data *p = new Data;//调用无参构造
delete p;
p = new Data(10,20);//调用有参构造
delete p;
//2、申请Data数组
//对象数组 每个元素 都会调用构造函数
//Data *arr = new Data[5]{{11,12},{21,22},{31,32},{41,42},{51,52}};
Data *arr = new Data[5]{Data(11,12),Data(21,22),Data(31,32),Data(41,42),Data(51,52)};
//如果delete不加[]只能释放数组的第0个元素
delete [] arr;
}
知识点4 【c++中申请堆区空间】
建议使用new、delete 而不是malloc,calloc,realloc和free
(1)、给对象申请空间需要做的事情
申请堆区空间(malloc,calloc,realloc) (new)
调用构造函数(new)
(2)、释放对象空间需要做的事情
调用析够函数(delete)
释放堆区空间(delete) (free)
总结:
new能申请空间调用构造函数,而malloc,calloc只能申请空间, delete会调用析够函数释放空间,而free只能释放空间
知识点5 【对象数组】
(1)、本质是数组 只是数组的每个元素是类的对象
运行结果:
(2)、如果想让对象数组中的元素调用有参构造 必须人为使用 有参构造初始化。
void test07()
{
//对象数组 arr1是数组 每个元素是Person类型的对象
//定义对象数组的时候 系统会自动给 数组中的每个元素 调用构造函数
//人为 为元素 调用有参构造
//初始化部分 调用有参构造 未初始化部分自动调用默认构造(无参构造)
Person arr1[5]={ Person("lucy",18), Person("bob",20)};
//arr1[0] 第0个元素 就是Person的对象
arr1[0].showPerson();
arr1[1].showPerson();
}
运行结果:
(3)、用new delete申请 对象数组
void test08()
{
//第一种方式
Person *arr = NULL;
arr = new Person[5];//调用无参构造
delete [] arr;
//第二种方式:
//初始化的元素 调用有参构造 没有初始化 的调用无参构造
Person *arr2 = new Person[5]{Person("lucy",18), Person("bob",20)};
(*(arr2+0)).showPerson();
arr2[0].showPerson();
(arr2+1)->showPerson();
delete [] arr2;
}
知识点6 【delete不能作用void *修饰的对象指针】
尽量不要用delete释放void *
注意:没有析构?为哈?
delete发现p1指向的类型 为void 无法从void中寻找响应析构函数