动态内存分配堆空间不够的情况
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++ 动态内存分配堆空间不足的程序设计
免责声明:内容仅供参考,不保证正确性。