zoukankan      html  css  js  c++  java
  • 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 不可以混搭使用...

  • 相关阅读:
    CentOS配置启动ssh与开机自启
    CentOS中怎样安装、配置、启动Nginx
    CentOS中配置Mysql表名忽略大小写以及提示:Caused by: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock的解决
    CentOS中部署jar包时提示:org.quartz.SchedulerException: Couldn't get host name
    CentOS6中怎样将jdk1.7升级到1.8
    CentOS6在使用yum install 时提示镜像源路径不存在:PYCURL ERROR 22
    信息系统项目管理师-项目立项管理考点笔记
    chrome89不再支持/deep/的解决方案
    手写async await
    proxy和reflect
  • 原文地址:https://www.cnblogs.com/loliconinvincible/p/12525718.html
Copyright © 2011-2022 走看看