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

2020-03-19 16:01:52来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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

从堆区申请空间,我们在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 }

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

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


原文链接:https://www.cnblogs.com/loliconinvincible/p/12525718.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:QT5中Json文件与QString的相互转化

下一篇:线段树学习资料