欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++ 中的new和delete理解与实操应用

程序员文章站 2022-04-15 15:29:37
从堆区申请空间,我们在C语言中有malloc、calloc、realloc,但是,我们在C++语言中,我们则是用new和delete来替代他们。 首先,我们来比较一下C中用来申请堆区空间的三个方法(malloc、calloc、realloc): 1.malloc返回一个void指针,C++不允许将v ......

从堆区申请空间,我们在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 给类对象申请空间

C++ 中的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 }

4.尽量不要delete 释放 void *(void *万能指针...)

5、malloc、free和new、delete 不可以混搭使用...