从堆区申请空间,我们在c语言中有malloc、calloc、realloc,但是,我们在c++语言中,我们则是用new和delete来替代他们。
首先,我们来比较一下c中用来申请堆区空间的三个方法(malloc、calloc、realloc):
1.malloc返回一个void指针,c++不允许将void赋值给其他任何指针,必须要强转。
2.malloc可能会申请内存失败,所以必须判断返回值来确保内存分配成功。
3.malloc不会调用构造函数,free不会调用构析函数(这是最最最重要的一点...)。
而...new 和delete都有两个作用,如下
1,new有2个作用
- 开辟内存空间。
- 调用构造函数。
2,delete也有2个作用
- 释放内存空间
- 调用析构函数。
清楚了c++为什么用new和delete后,我们再来明白new的用法-------
1.new 给基本类型申请空间
1 void tesk1()
2 {
3 //基本类型
4 int *p = null;
5
6 //p = (int *)calloc(1,sizeof(int));
7 //p = new int(100); --->*p = 100;
8
9 p = new int;
10 *p = 100;
11 cout<<"*p="<<*p<<endl;//100
12
13 //free(p);释放
14 delete p;
15 }
2.new 申请基本类型数组空间
1 void tesk1()
2 {
3 //申请 int数组
4 int *arr = null;
5 //arr = (int *)calloc(5,sizeof(int));
6 arr = new int[5];//申请空间的时候内容初始化,值随机 //arr = new int[5]{1,2,3,4,5};内容不随机
7
8 int i = 0;
9 for(i=0;i<5;i++)
10 {
11 cout<<arr[i]<<" ";
12 }
13 cout<<endl;
14
15 //释放 new时加[] delete也必须加[]
16 delete [] arr;
17 }
18 int main(int argc, char *argv[])
19 {
20 tesk1();
21 return 0;
22 }
注意:
new 没有加[] delete释放的时候就不加[]
new 加 [] delete释放的时候加 []
3、new delete 给类对象申请空间
有一些地方会用new和delete申请对象数组
我们先简单的了解一下对象数组----本质是数组,只是数组的每个元素是类的对象
举两个例子...
1...
1 void tesk3()
2 {
3 //对象数组 arr1 是数组,每个元素是person类型的对象
4 //定义对象数组的时候,系统会自动给数组中的每个元素调用构造函数
5 //自动调用无参构造
6 person arr1[5];
7 }
8 //会调用5次无参函数和5次析构函数
2.如果想让对象数组中的元素调用有参构造,必须人为使用有参构造初始化...
1 void tesk5()
2 {
3 //对象数组 arr1是数组,每个元素是person类型的对象
4 //定义对象数组的时候,系统会自动给数组中的每个元素调用析构函数
5 //人为 为元素调用有参析构
6 //初始化部分,调用有参构造为初始化部分自动调用默认构造(无参构造)
7 person arr1[5] = {person("lucy",18),person("bob",20)};
8 //arr1[0] 第0个元素 就是person的对象
9 arr1[0].showperson();
10 arr1[1].showperson();
11 }
3、用new delete申请 对象数组
1 void tesk06()
2 {
3 //第一种方式
4 person *arr = null;
5 arr = new person[5];//调用无参构造
6
7 delete [] arr;
8
9 //第二种方式:
10 //初始化的元素,调用有参构造,没有初始化的调用无参构造
11 person *arr2 = new person[5]{person("lucy",18),person("bob",,20)};
12 (*(arr2+0)).showperson();
13 arr[0].showperson();
14 (arr2+1)->showperson();
15 delete [] arr2;
16 }