zoukankan      html  css  js  c++  java
  • C++ 动态存储空间的分配和释放 new与malloc的区别

    使用new申请空间:

    特点:

            1、没有名字,只能通过指针间接访问它们。

            2、从堆中申请空间

    分类:

    变量:

              语法:指针变量 = new 类型名;

                          Delete 指针变量

              举例:int *p;

                          p=new int;

                          delete p;

              初始化:

                           *p=90;

                           p=new int(99);

    一维数组:

               语法:指针变量 = new 类型名[下标表达式]; 下标表达式是整型常量或整型表达式

                           Delete [ ]指针变量;---[ ]表明是个数组,但不需要指出其大小

               举例:Int *p;

                           P= new type[s];

                           Delete [ ]p;

    多维数组(二维数组):  必须指出所有维的长度

               语法:指针变量 = new 类型名[下标表达式] [下标表达式];

                           Delete [ ]变量名

               举例:定义一个3×4的数组

                           Int (*p)[4]; p是个指针,它指向一个n维数组(4定义的时候必须已知,即后几维必须已知

                           p=new int[3][4];// 第一维可以是常量或表达式,其他维必须全部为常量

                           Delete [ ]p;

    对象:可以在创建对象的时候同时进行初始化

               语法: 类名 *指针变量 = new 类名(实参表);

    对象数组:

               语法:类名 数组名[元素个数];

                           或: 类名* 指针名;指针名=new 类名[数组长度];

               举例:Point A[2];

                           Point* p;

                          *p=new Point[5];

                           delete [ ]p;

               初始化:每个对象都要调用一次构造函数和一次析构函数。

                     1)对象数组确定且长度有限:可以使用参数列表初始化

                        Point A[2]={Point(1,2),Point(3,4)};

                     2)对象数组长度比较大或不确定:只能调用无参或者使用缺省参数的函数

                      Point A[2];

                原因:在建立对象数组的时候,C++不允许整体对对象进行初始化(即[ ]和( )不能一起使用),这时不能给对象 使用有参数的构造函数

                所以:创建一个类的对象数组,就对给类的构造函数有要求:对象数组只能调用一个不需要参数的构造函数

    常见问题:

    1):有了malloc/free 为什么还要new/delete?

    malloc/free 只能满足内部数据类型的变量,它们只需要申请空间,无法对空间进行操作

    而对于非内部数据类型的对象来说,对象在创建的同时要自动执行构造函数,在消亡之前要自动执行析构函数。

    由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够自动地调用构造函数和析构函数。即用无法满足动态对象的要求。

    因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete

    注意new/delete 不是库函数,而是运算符。malloc/free 是标准库函数。

    2):malloc/free  和 new/delete 的相同点和不同点

            相同点:它们都可以申请和释放空间。

             不同点:

                          一、new :分配内存 + 调用类的构造函数 + 初始化  delete:释放内存 + 调用类的析构函数

                                  malloc:只分配内存,不会进行初始化类成员的工作   free只释放内存,不会调用析构函数

                          二、new delete 是运算符,可以进行重载

                                  malloc,free是函数,不可以进行重载

                          三、new delete 更加安全,简单:

                                  不用计算类型大小:自动计算要分配存储区的字节数

                                  不用强制类型转换:自动返回正确的指针类型

                         四、new可以分配一个对象或对象数组的存储空间,malloc不可以

                         五、可以超载与类相关的new和delete

                         六、malloc/free 是标准库函数,new/delete是C++运算符

    2):new和delete搭配使用,malloc和free搭配使用:混搭可能出现不可预料的错误

    3):new后执行的三个操作:(某面试题目)

             1、new的类分配内存空间。
             2、 调用类的构造方法。
             3 、返回该实例(对象)的内存地址

  • 相关阅读:
    Html5新增视频功能——video API 事件
    HTML5新增的视频功能——video属性
    jQuery封装的tab组件(可选自动+可选延迟处理+按需加载)
    jQuery封装tab选项卡组件(自定义自动功能和延迟显示功能)
    jQuery对象只能使用jQuery提供的方法,不能使用原生js提供的方法
    语法糖 —— 糖糖糖
    面向对象
    Call to undefined function IlluminateEncryptionopenssl_cipher_iv_length()
    HTTP协议
    功能算法
  • 原文地址:https://www.cnblogs.com/tham/p/6827220.html
Copyright © 2011-2022 走看看