当分配内存的请求没有被成功执行时,系统会抛出一个用bad_alloc类来描述出的异常。
1 定义
bad_alloc类的定义如下所示
class bad_alloc : public exception
{
bad_alloc();
virtual ~bad_alloc();
bad_alloc(const bad_alloc&);
bad_alloc& operator=(const bad_alloc&);
const char* what() const override;
};
其中,what()成员函数返回的是分配内存失败的原因。
2 例子
#include<iostream>
using namespace std;
int main()
{
char* ptr;
try {
ptr = new char[(~unsigned int((int)0) / 2) - 1];
delete[] ptr;
}
catch (bad_alloc &ba) {
cout << ba.what() << endl;
}
return 0;
}
其中,(~unsigned int((int)0)是对unsigned int((int)0)逐位取反,得到的值是0xFFFFFFFF,之后对其进行除2操作,即左移一位,得到的值是0x7FFFFFFF,即2G。而一个应用程序一般有4G的虚拟内存,其中2G由系统使用,2G由应用程序使用。如果将这2G由应用程序使用的内存空间均用new来分配给ptr,此时肯定会报错。使用catch捕获抛出的异常,ba.what()得到失败的信息。此时的输出如图1所示。
图1 失败信息