C++ 动态内存分配堆空间不足可采用的两种程序设计方法

动态内存分配堆空间不够的情况

C++中,使用new运算符可以在堆(内存区域)中动态地分配内存,可是当堆中的内存不足够匹配new运算符分配的空间的时候,(据文档介绍时C++11之后)动态分配内存无法完成,C++的编译器会抛出std::bad_alloc的异常(以前的版本可能不会抛出异常,但会返回一个指向NULL或nullptr的指针)。

相应的程序设计

在C++编程过程中,如果遇到了动态内存分配遇到堆内存空间不足的情况,可以使用trye...catch...语句来捕获抛出的异常,也可以使用std::nothrow版的new来返回nullptr的指针,而不是抛出异常。下面将通过实例来逐一进行介绍。

捕获异常的实例代码

C++的try...catch语句将在后面的章节中进行详细的介绍,这里简单了解一下即可:

提示:使用std::bad_alloc需要include <new>。

#include <iostream>
#include <new>
using namespace std;


int main(){
    try{
        int* largeArray = new int[90000000000];
        std::cout << largeArray << std::endl;
        delete[] largeArray; //动态删除数组内存的语法,将在下一章节中详细介绍
        largeArray = nullptr;
    }catch(const std::bad_alloc& e){
        std::cerr << "动态内存分配未完成:"<< e.what() << std::endl;
    }
    return 0;
}

编译运行后,得到输出:

动态内存分配未完成:std::bad_alloc

返回nullptr指针的程序设计

C++动态内存分配的时候遇到堆空间不足的情况却又不想捕获异常,那么可以使用std::nothrow版的new来动态地分配内存,具体的用法可参考下方的实例代码:

#include <iostream>
using namespace std;


int main(){
    
    int* largeArray = new(std::nothrow) int[90000000000];
    if(largeArray == nullptr){
        cout << "动态分配内存未完成" << endl;
    }else{
        delete[] largeArray;
        largeArray = nullptr;
    }

    return 0;
}

编译运行后,得到输出:

动态分配内存未完成

原文(及后续章节):C++ 动态内存分配堆空间不足的程序设计

免责声明:内容仅供参考,不保证正确性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值