VC中如何做才能让new失败时抛出一个std::bad_alloc异常?
在标准C++中,new一个对象时如果分配内存失败就会抛出一个std::bad_alloc异常。如果希望new操作失败时不抛出异常而仅仅传回一个NULL指针,可以这样显式地调用:new(nothrow)。
现在有如下代码:
01 #include <new>
02 #include <iostream>
03
04 using namespace std; // std c++ libs implemented in std
05
06 class BigClass
07 {
08 public:
09 BigClass() {}
10 ~BigClass(){}
11 double BigArray[99999999];
12 };
13
14 void main()
15 {
16 try
17 {
18 BigClass * p = new BigClass;
19 }
20 catch( bad_alloc a)
21 {
22 const char * temp = a.what();
23 cout << temp << endl;
24 cout << "Threw a bad_alloc exception" << endl;
25 }
26
27 BigClass * q = new(nothrow) BigClass;
28 if ( q == NULL )
29 cout << "Returned a NULL pointer" << endl;
30
31 try
32 {
33 BigClass * r = new BigClass[3];
34 }
35 catch( bad_alloc a)
36 {
37 const char * temp = a.what();
38 cout << temp << endl;
39 cout << "Threw a bad_alloc exception" << endl;
40 }
41 }
标准C++的operator new操作符声明在<new>头文件中:
void *__cdecl operator new(size_t) _THROW1(std::bad_alloc);
void *__cdecl operator new(size_t, const std::nothrow_t&) _THROW0();
抛出异常的operator new定义在newop.cpp里,不抛出异常的operator new定义在newop2.cpp里。
以上代码在VC6.0中编译连接通过,但是在程序运行期间18行和33行new操作无论如何都不会抛出一个std::bad_alloc异常,而只是返回一个NULL指针。于是我跟踪进每一个new调用观察,发现18和33行的new实际上调用了new.cpp里的operator new,而这个operator new是不抛出异常的,所以在我的程序里就抓不到std::bad_alloc了。现在我不明白的是为什么程序不调用newop.cpp里的operator new?而27行的new(nothrow)则确实调用了newop2.cpp里的operator new,执行结果就是返回了一个NULL指针。
我要如何做才能在VC中让new失败时能够抛出一个std::bad_alloc异常?