• 类和对象(9)—— new和delete


    对象动态建立和释放 new 和delete

      在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除。在C语言中是利用库函数malloc和free来分配和撤销内存空间的。C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数。

                   new和delete是运算符,不是函数,因此执行效率高。                


            虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用malloc和free函数,而用new和delete运算符。

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

     new运算符动态分配堆内存

    使用形式:指针变量=new 类型(常量);

         指针变量=new 类型[表达式];

    作用:从堆分配一块“类型”大小的存储空间,返回首地址

    其中:“常量”是初始化值,可缺省

       创建数组对象时,不能为对象指定初始化值

    delete运算符释放已分配的内存空间

    使用形式:delete 指针变量;

         delete[] 指针变量;

    其中:“指针变量”必须是一个new返回的指针

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

    malloc不会调用类的构造函数,而new会调用类的构造函数;

    free不会调用类的析构函数,而delete会调用类的析构函数。

    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    using namespace std;
    
    //C语言中
    void test1()
    {
        int *p = (int*)malloc(sizeof(int));
        *p = 10;
        if (p != NULL);
        {
            free(p);
            p = NULL;
        }
    
         int *array_p = (int*)malloc(sizeof(int) * 10);//数组
    
        for (int i = 0; i < 10; i++)
        {
            array_p[i] = i + 1;
        }
        for (int i = 0; i < 10; i++)
        {
            printf("%d ", array_p[i]);
        }
        printf("
     ");
    }
    
    //C++语言中
    void test2()
    {
        int *p = new int;
        *p = 10;
        if (p != NULL)
        {
            delete p;
            p = NULL;
        }
    
        int *array_p = new int[1for (int i = 0; i < 10; i++)
        {
            array_p[i] = i + 1;
        }
        for (int i = 0; i < 10; i++)
        {
            cout << array_p[i] << " " ;
        }
        cout << endl;
    
        if (array_p!= NULL)
        {
            delete[] array_p;
        }
    }
    
    int main(void)
    {
        test1();
        cout << "-----------------------" << endl;
    
        test2();
    
        return 0;
    }
  • 相关阅读:
    JS leetcode 买卖股票的最佳时机 题解分析,我离职了。
    JS leetcode x 的平方根 题解分析
    JS leetcode 有多少小于当前数字的数字 解题分析,你应该了解的桶排序
    JS leetcode 合并两个有序数组 解题分析
    JavaSE部分 (多线程下)
    JavaSE部分 (多线程上)
    JavaSE部分 (异常)
    JavaSE部分 集合下(Map)
    JavaSE部分 集合中(数据结构 list set Collections)
    JavaSE (接口 final 内部类)
  • 原文地址:https://www.cnblogs.com/yuehouse/p/9798914.html
Copyright © 2020-2023  润新知