曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 2879|回复: 0
打印 上一主题 下一主题

内存分配时抛出的异常(bad_alloc)

[复制链接]

716

主题

734

帖子

2946

积分

超级版主

Rank: 9Rank: 9Rank: 9

积分
2946
跳转到指定楼层
楼主
发表于 2013-7-6 20:29:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
当使用 new 操作符为变量分配内存时,如果没有足够的内存可以分配,那么该操作符就会抛出一个使程序终止的异常。在大多数情况,忽略该异常是完全可以接受的,因为没有多余的内存通常是程序的终止条件,此刻我们通常不能做任何事情。但是,在有些情况下,我们可能有机会自己进行相应的处理,或者希望以自己的方式报告出现的问题。这时,可以捕获 new 操作符所抛出的异常。

当不能分配内存时,new 操作符抛出的异常是 bad_alloc 类型。bad_allocnew 标准头文件中定义的类类型。

测试代码
[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() 函数,以提供字符串来描述抛出的异常的原因。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 13:04 , Processed in 0.113985 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表