• 【CPP知识】try-catch处理内存分配失败的异常


    【CPP知识】try-catch处理内存分配失败的异常

    1、背景

    关于try-catch:
    try-catch即try/throw/catch。
    try语句块是用来判断是否有异常;
    throw是抛出异常;
    catch语句块捕捉异常,并进行处理;

    注意:
    catch的数据类型需要与throw出来的数据类型相匹配的!
    在try语句块中如果throw出异常之后,那么try语句块后续代码将不再执行。

    关于内存异常:
    c++ 语言允许开发者使用new 手动的分配内存空间进行管理。
    new 和delete通常需要成对使用,即开发者需要及时的释放内存,否则很容易内存泄漏。
    一般当分配较大块内存时,需要配合进行内存分配失败的异常处理。避免程序的运行错误或崩溃。

    那么遇到内存申请空间不够的情况下就该使用try-catch抛出异常。

    2、示例1

    利用try-catch模块函数,将内存分配语句放在try中,这样出现了异常就会立刻获得,从而转入匹配的catch块进行处理。
    catch的参数是异常类型,内存不足为 std::bad_alloc。

    源代码内容如下:

    // jn10010537
    #include   
    #include   
    using namespace std;
    
    int* a;
    const int num = 9000000000;
    
    int main() {
    
        // try语句块 用来判断是否有异常;
        try{   
            //throw 是抛出异常;
            // 分配内存
            for (; ; ){ 
                a = new int[num]; // 注意num 需要为一个常量,即确定的值    
            }  
            cout << "******************" << a << endl;
            
            string error = "2022.07.31";
            throw error;
        }
    
        // catch语句块 捕捉异常,并进行处理;
        // catch的数据类型需要与throw出来的数据类型相匹配的。
        catch (std::bad_alloc) {
            cout << "[INFO] 内存不足,请及时释放内存空间!" << endl;
    
        }
    
        catch (string str){
            // 扑捉throw抛出异常类型为string数据类型的异常
            cout << "[INFO] 第二个异常:" << str<< endl;
        }
        
        return 0;
       
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    运行如下:
    在这里插入图片描述

    3、示例2

    本示例用于说明:
    在try语句块中如果throw出异常之后,那么try语句块后续代码将不再执行。

    源代码内容如下:

    #include   
    #include   
    using namespace std;
    
    int main() {
    
        // try语句块 用来判断是否有异常;
        try{   
            //throw 是抛出异常;
            // 注意一旦抛出一个异常,try 语句块内后续的代码将不再执行!
            throw 10010537;
    
            string error = "第二次异常提醒";
            throw error;
        }
    
        // catch语句块 捕捉异常,并进行处理;
        // catch的数据类型需要与throw出来的数据类型相匹配的。
        catch (int i) {
            // 扑捉throw抛出异常类型为int数据类型的异常
            cout << "[INFO] 第一个异常:" << i << endl;
        }        
        catch (string str){
            // 扑捉throw抛出异常类型为string数据类型的异常
            cout << "[INFO] 第二个异常:" << str<< endl;
        }
        
        return 0;
       
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    运行如下:
    在这里插入图片描述

  • 相关阅读:
    JavaEE、SSM基础框架、JavaWeb、MVC(认识)
    干货!教您使用工业树莓派结合CODESYS配置EtherCAT主站
    [RocketMQ] Broker CommitLogDispatcher 异步构建ConsumeQueue和IndexFile源码解析 (十四)
    MFC学生成绩管理系统
    做3D建模的女生多吗?揭露行业比列
    AM@微分中值定理
    从零开始学Graph Database:什么是图
    mybatis缓存介绍
    docker+nginx+redis部署前后端分离项目!!!
    2023年【通信安全员ABC证】找解析及通信安全员ABC证考试总结
  • 原文地址:https://blog.csdn.net/jn10010537/article/details/126085405