关于C++的new关键字的异常处理

Posted by Harid六月 - 7 - 2010 Leave comments

今天晚上有C++的实验课,课上有个题中有这样的一个要求:

e) (选作)想办法将内存耗尽,使得在使用new运算符时无法分配内存,并输出提示信息“Out of memory”。

看到这个题,我不由地想到了一些东西,尤其想到了(美)Robert C. Seacord 写的那本《C和C++安全编码》一书中关于new的异常处理的一段。他说到一点很有用,就是在用new关键字开辟内存空间的时候,可以用”nothrow“参数来使开辟失败时不抛出异常,而是在开辟失败时返回数字0。

这一点有时还是很有用的!我们很多时候只需判断是否开辟成功就行,而不需要另外很多的处理语句时,就可以用这个参数来关闭抛出异常,从而极大地简化了判断形式。

我们可以用类似于下面的方式来作出判断:

1
2
3
4
5
6
7
8
9
10
11
 ……
int * temp = new(nothrow) int[10];
if(!temp)
{
      std::cout<<"Can't allocate memory!\n";
}
else
{
      ……
}
……

另外,题目这里的“将内存耗尽”,并不是说要你真的将内存耗得一点不剩,那是非常困难的(不是说不会,而是说可能要等太长的时间)。因为现在电脑内存,少说也是上GB的,加上虚拟内存……所以如果你每次new一个单位的数据类型,很明显要用相当长的时间。所以这里的“将内存耗尽”,只是想要你弄个“分配失败”出来。

因为new开辟的内存是在堆中按块开辟的,即获得的是一段连续的空间,而不是像非线性链表那样的数据结构,所以我们只要让它每次开辟一块很大的内存就很容易出现“无法分配”的情况了。如:

1 int * temp = new(nothrow) int[900000000];

这样相信很快就出现无法分配的情况了。

关于new的异常处理,更多的请查阅相关资料,如“百度百科”,这里不做讨论。

   声明:本文采用 BY-NC-SA 协议进行授权 | 星期九
   原创文章转载请注明:转自《关于C++的new关键字的异常处理

  1. 你的程序并不是说可以使用所有的虚拟内存空间,当你的程序开始执行的时候,由当前的进程创建一个子进程,然后将程序代码载入子进程中,执行,每一个进程,操作系统都会给其分配一定数量的空间,堆栈段,代码段,数据段,你使用new操作符进行的动态程序空间划分,绝度只能在操作系统给本进程划分的堆栈段里进行,一点超过空间限制,进程理解就会被杀死。


分享按钮