当使用 new 操作符为变量分配内存时,如果没有足够的内存可以分配,那么该操作符就会抛出一个使程序终止的异常。在大多数情况,忽略该异常是完全可以接受的,因为没有多余的内存通常是程序的终止条件,此刻我们通常不能做任何事情。但是,在有些情况下,我们可能有机会自己进行相应的处理,或者希望以自己的方式报告出现的问题。这时,可以捕获 new 操作符所抛出的异常。
当不能分配内存时,new 操作符抛出的异常是 bad_alloc 类型。bad_alloc 是 new 标准头文件中定义的类类型。
测试代码:
[C++] 纯文本查看 复制代码 #include<new> // For bad_alloc type
#include<iostream>
using std::bad_alloc;
using std::cout;
using std::endl;
int main( )
{
char* pdata(nullptr);
size_t count(~static_cast<size_t>(0)/2);
try
{
pdata = new char[count];
cout << "Memory allocated." << endl;
}
catch(bad_alloc &ex)
{
cout << "Memory allocation failed." << endl
<< "The information from the exception object is: "
<< ex.what() << endl;
}
delete[] pdata;
return 0;
}
输出:Memory allocation failed.
The information from the exception object is: bad allocation 说明:
在上面的程序中,char[ ] 是一个数组,它的长度为 count,而 count 的大小则由 size_t count(~static_cast<size_t>(0)/2); 这条语句来初始化。需要注意的是,size_t 类型一般是一个 unsigned int 的宏定义。因此它可以表示最大的整数值。因此表达式 ~static_cast<size_t>(0)/2 对 0 的所有位取反,那么就会得到一个所有位全为 1 的 size_t 值,那么它必然是一个最大范围值。该值超出 new 操作符一次可以分配的最大内存容量。虽然我们令其除以 2 以落入允许的范围之内,即便如此,结果也是一个非常大的数,因此除非机器有特别大的内存,否则分配请求必然失败。
内存的分配发生在 try 代码块。如果分配成功,那么可以看到正常的消息提示;如果分配如预期那样失败了,那么 new 操作符就会抛出一个 bad_alloc 类型的异常,这会使得 catch 代码块中的代码得以执行。bad_alloc 对象的引用 ex 调用了 what() 函数,它将返回一个字符串来描述导致异常的问题。大多数异常类都实现了 what() 函数,以提供字符串来描述抛出的异常的原因。 |