C++动态内存的分配、使用、释放以及内存泄漏

C++动态内存的分配、使用、释放以及内存泄漏

上节我们介绍了为什么要使用动态内存。C++之为什么要使用动态内存分配

本节我们讲方法。

  • 在开发过程中,我们经常需要使用动态内存分配和撤销内存空间,特别是数据结构中节点的插入和删除。在C语言中是利用库函数mallocfree来分配和撤销内存空间的,C++提供了较简便而且功能较强的运算符newdelete来取代mallocfree函数。

  • 注意:newdelete不是函数,是运算符,因此效率高!

  • 为了与C兼容,C++仍然保留mallocfree函数,但不建议使用。

  • 例子:

    • new int; //开辟一个存储整数的空间,返回空间的地址。
    • new int(10); //开辟一个存储整数的空间并且指定整数的初值为10,返回空间的地址。
    • new int[100];//开辟一个能存放100个int元素的空间,返回空间的首地址。
    • new int[3][4];//开辟一个二维数组大小为3行4列,返回空间的首地址。
  • new格式:

    new运算符 动态内存分配。

    • 指针变量 = new 类型(常量);
    • 指针变量 = new 类型[表达式];
    • 指针变量 = new 类型[表达式][表达式];

    作用: 从堆上分配一块指定类型,指定大小的空间,并且返回空间的首地址!
    注意: 第一个方式中常量是初始化值, 可以缺省。创建数组时,无法指定初始值。

  • delete格式:
    delete运算符 释放已经分配的内存空间。
    使用方式: delete 指针变量;
    注意: delete的指针变量,必须是new分配过的指针!

  • 例:

    #include <stdio.h>  
    #include <stdlib.h>  
    #include <string.h>
    
    using namespace std;
    
    int main() {
        //第一种方式
        int* a = new int(4);
    
        //第二种方式
        int* b = new int[10];
        //也可以用malloc
        delete[] b;//也可以用free(b);
        b = (int*)malloc(10 * sizeof(int));
        free(b);
    
        //第三种方式
        int (*c)[4] = new int[3][4];
    
        free(a);
        delete[] c;
    
        return 0;
    }
    

    注意: delete与free可以混搭

  • 内存泄漏: (Memory Leak) 指的是程序中已经动态分配的堆内存因为某种原因,未释放或者无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果!
    例子:(正常情况,用完就释放)

    #include <stdio.h>  
    #include <stdlib.h>  
    #include <string.h>
    #include <Windows.h>
    
    using namespace std;
    
    //正常的用完就释放
    void test() {
        int* a = new int[1024]; //每次申请4k
        a[0] = 0;
        delete[] a;
    }
    
    int main() {
    
        for (int i = 0; i < 1000000; i++) {
            test();
            Sleep(50); //休眠0.05s
        }
    
        return 0;
    }
    

    打开任务管理器,发现占用内存不会增加。

    异常版本: (用了不释放)

    #include <stdio.h>  
    #include <stdlib.h>  
    #include <string.h>
    #include <Windows.h>
    
    using namespace std;
    
    //用完不释放
    void test() {
        int* a = new int[1024]; //每次申请4k
        a[0] = 0;
    }
    
    int main() {
    
        for (int i = 0; i < 1000000; i++) {
            test();
            Sleep(50); //休眠0.05s
        }
    
        return 0;
    }
    

    结果:打开任务管理器,观察。
    在这里插入图片描述

    过一会儿:
    在这里插入图片描述

    可以直观的看到内存的不断增加。

    可以预见,时间变长,循环次数变多会导致怎样的结果!

本节我们介绍了动态内存,下节我们介绍变量的存储类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值