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 、返回该实例(对象)的内存地址

  • 相关阅读:
    475. Heaters
    69. Sqrt(x)
    83. Remove Duplicates from Sorted List Java solutions
    206. Reverse Linked List java solutions
    100. Same Tree Java Solutions
    1. Two Sum Java Solutions
    9. Palindrome Number Java Solutions
    112. Path Sum Java Solutin
    190. Reverse Bits Java Solutin
    202. Happy Number Java Solutin
  • 原文地址:https://www.cnblogs.com/tham/p/6827220.html
Copyright © 2011-2022 走看看