龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

在VC6.0中如何让new操作失败后抛出异常?(2)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
现在我们用实际代码来测试一下new会不会抛出异常,建一个test.cpp源文件: // test.cpp #include new #include iostream using namespace std; class BigClass { public: BigClass() {

    现在我们用实际代码来测试一下new会不会抛出异常,建一个test.cpp源文件:

// test.cpp
#include <new>
#include <iostream>
     
using namespace std;
     
class BigClass
{
public:
   BigClass() {}
   ~BigClass(){}
   char BigArray[0x7FFFFFFF];
};
     
int main()
{
   try
   {
      BigClass *p = new BigClass;
   }
   catch( bad_alloc &a)
   {
      cout << "new BigClass, threw a bad_alloc exception" << endl;
   }
     
   BigClass *q = new(nothrow) BigClass;
   if ( q == NULL )
      cout << "new(nothrow) BigClass, returned a NULL pointer" << endl;

   try
   {
      BigClass *r = new BigClass[1];
   }
   catch( bad_alloc &a)
   {
      cout << "new BigClass[1], threw a bad_alloc exception" << endl;
   }

   return 0;
}

根据VC6.0编译器与链接器的做法(请参考《为什么会出现LNK2005"符号已定义"的链接错误?》),链接器会首先在C++标准库中解析符号,然后才是C标准库,所以如果开发者没有自定义operator new的话最后程序链接的应该是C++标准库中newop.obj和newop2.obj模块里的代码。可是程序运行的结果却是:

new(nothrow) BigClass, returned a NULL pointer

显然程序始终未抛出bad_alloc异常。单步跟踪观察,发现第1个和第3个new实际上调用了new.cpp里的operator new,而第二个new(nothrow)则正确地调用了newop2.cpp定义的版本。很难理解是吧?但是当你用

dumpbin /SYMBOLS libcp.lib

精彩图集

赞助商链接