C++_13_ new 和 delete 基本语法 - 重写版

发布时间 2023-11-05 23:20:48作者: 尘落曦枫

new 和 delete 操作符

  1 、(C    ) 库函数:    malloc    free                    malloc() 函数具有分配存储空间的功能,但除了分配存储空间外,不会调用类的构造函数。 free() 函数可以释放对象存储空间,同样不会调用析构函数。
      (C++)运算符:  new        delete            new 和 new[] 操作符则不会如此,使用它们为对象分配存储空间的同时,它们也会调用相应的构造函数。操作符 delete 和 delete[] 在释放对象存储空间的同时也会调用析构函数

   2、new 和 delete 是运算符,不是函数,因此执行效率高
   3、虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用malloc和free函数,而用new和delete运算符

 

new语法:
      new int;        //开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针)
      new int(100);     //开辟一个存放整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址
      new char[10];    //开辟一个存放字符数组(包括10个元素)的空间,返回首元素的地址
      new int[5][4];     //开辟一个存放二维整型数组(大小为5*4)的空间,返回首元素的地址
      float *p=new float (3.14159);     //开辟一个存放单精度数的空间,并指定该实数的初值为//3.14159,将返回的该空间的地址赋给指针变量p
      delete p;                //释放指针p指向的内存空间

 

  1. new运算符动态分配堆内存
    使用形式:指针变量=new类型(常量) ;
                 指针变量=new类型[表达式];
    作用:从堆分配-块“类型”大小的存储空间,返回首 地址
    其中:“常量”是初始化值,可缺省
                创建数组对象时,不能为对象指定初始值

  2. delete运算符释放已分配的内存空间
    使用形式:delete 指针变量;
                delete[]指针变量;
    其中:“指针变量”必须是一个new返回的指针

 

  用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL,用户可以根据该指针的值判断分配空间是否成功。

C++中,可以用new运算符动态建立对象,用delete运算符撤销对象
  Box *pt;  //定义一个指向Box类对象的指针变量pt
    pt=new Box;  //在pt中存放了新建对象的起始地址
在程序中就可以通过pt访问这个新建的对象。如
  cout<<pt->height;  //输出该对象的height成员
  cout<<pt->volume( );  //调用该对象的volume函数,计算并输出体积
C++还允许在执行new时,对新建立的对象进行初始化。如
  Box *pt=new Box(12,15,18);
这种写法是把上面两个语句(定义指针变量和用new建立新对象)合并为一个语句,并指定初值。这样更精炼。
  新对象中的height,width和length分别获得初值12,15,18。调用对象既可以通过对象名,也可以通过指针。
  在执行new运算时,如果内存量不足,无法开辟所需的内存空间,目前大多数C++编译系统都使new返回一个0指针值。只要检测返回值是否为0,就可判断分配内存是否成功。
  ANSI C++标准提出,在执行new出现故障时,就“抛出”一个“异常”,用户可根据异常进行有关处理。但C++标准仍然允许在出现new故障时返回0指针值。当前,不同的编译系统对new故障的处理方法是不同的。
  在不再需要使用由new建立的对象时,可以用delete运算符予以释放。如delete pt; //释放pt指向的内存空间,这就撤销了pt指向的对象。此后程序不能再使用该对象。
  如果用一个指针变量pt先后指向不同的动态对象,应注意指针变量的当前指向,以免删错了对象。在执行delete运算符时,在释放内存空间之前,自动调用析构函数,完成有关善后清理工作。

//1   malloc free函数                     C函数
//     new delete 操作符号             C++的关键字

//2   new 在堆上分配内存  delete
//     分配基础类型 、分配数组类型、分配对象

//3 new和malloc 深入分析
       混用测试、异同比较
结论:     malloc不会调用类的构造函数
           Free不会调用类的析构函数


new可以给如下类型申请空间并返回地址:

  1. new给基本类型变量变量申请空间;
     int *p = new int(100);      // *p = 100
  2. new给数组申请空间;
     char *arr = new char[32]; //可以直接接{'z','h','a','i'} 进行赋值操作,直接接字符串?
  3. new给类的对象申请空间;
     Person *p = new Person;    //申请成功就会 自动调用类的构造函数

 

顺便提一下对象数组的概念

Person arr1[5];   //定义的是个数组,每个元素都是类的对象
//定义对象的时候会自动调用无参构造函数